一.对象及变量的并发访问
Posted duan2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一.对象及变量的并发访问相关的知识,希望对你有一定的参考价值。
章主要介绍Java多线程中的同步,也就是如何在java语言中写出线程安全的程序。
synchronized同步方法
非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”。
方法内的变量为线程安全
“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全问题”,所得的结果也就是线程安全了。
方法中的变量不存在非线程安全问题,永远都是线程安全的。这是方法内部变量是私有的性质决定的。
实例变量非线程安全
如果多个线程共同访问一个对象中的实例变量,则有可能出现“非线程安全”问题。
多个对象多个锁
上面的例子是两个线程分别访问同一个类的两个不同实例的相同名称的同步方法。效果却是以异步的方式运行的。
本示例由于创建了2个业务对象,在系统中产生了2个锁,所以运行的结果是异步的,打印的效果就是先打印b,然后打印a。
也是说同步方法的锁就是该对象实例。
synchronized方法和锁对象
调用关键字synchronized声明的方法一定是排队运行的。另外需要牢记“共享”两个字。只有共享资源的读写访问才需要同步化,如果
不是共享资源,那么根本没有同步的必要。
脏读
synchronized锁重入
出现异常,锁自动释放
当一个线程执行的代码出现异常时,其所持有的锁会自动释放。
同步不具有继承性
synchronized同步代码块
synchronized同步代码块
当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象中的非同步代码块。
验证同步synchronized(this)代码块时锁定当前对象的
和synchronized方法一样,synchronized(this)代码块也是锁定当前的对象的。
将任意对象作为对象监视器
这个任意对象大多数是实例对象或方法参数。
使用“synchronized(非this对象)”同步代码块格式进行同步操作时,对象监视器必须是同一个对象。如果不是同一个对象监视器,运行的结果就是异步了。
细化三个结论
静态同步synchronized方法与synchronized(class)代码块
关键字synchronized还可以应用在static静态方法上,如果这样写,那就是对当前的。*.jave文件对应的Class类进行持锁,测试项目在synStaticMethod中.
以上是关于一.对象及变量的并发访问的主要内容,如果未能解决你的问题,请参考以下文章
对象及变量的并发访问-----synchronized同步----- 脏读