一.对象及变量的并发访问

章主要介绍Java多线程中的同步,也就是如何在java语言中写出线程安全的程序。java

synchronized同步方法

  非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是“脏读”。安全

方法内的变量为线程安全

  “非线程安全”问题存在于“实例变量”中,若是是方法内部的私有变量,则不存在“非线程安全问题”,所得的结果也就是线程安全了。多线程

 

 

 

 方法中的变量不存在非线程安全问题,永远都是线程安全的。这是方法内部变量是私有的性质决定的。并发

实例变量非线程安全

若是多个线程共同访问一个对象中的实例变量,则有可能出现“非线程安全”问题。异步

多个对象多个锁

 

 

 

 

上面的例子是两个线程分别访问同一个类的两个不一样实例的相同名称的同步方法。效果倒是以异步的方式运行的。测试

本示例因为建立了2个业务对象,在系统中产生了2个锁,因此运行的结果是异步的,打印的效果就是先打印b,而后打印a。this

也是说同步方法的锁就是该对象实例。线程

 

synchronized方法和锁对象

调用关键字synchronized声明的方法必定是排队运行的。另外须要牢记“共享”两个字。只有共享资源的读写访问才须要同步化,若是3d

不是共享资源,那么根本没有同步的必要。对象

 

脏读

synchronized锁重入

 

出现异常,锁自动释放

当一个线程执行的代码出现异常时,其所持有的锁会自动释放。

同步不具备继承性

synchronized同步代码块

synchronized同步代码块

当一个线程访问object的一个synchronized同步代码块时,另外一个线程仍然能够访问该object对象中的非同步代码块。

验证同步synchronized(this)代码块时锁定当前对象的

和synchronized方法同样,synchronized(this)代码块也是锁定当前的对象的。

 

 

 

 将任意对象做为对象监视器

这个任意对象大多数是实例对象或方法参数。

使用“synchronized(非this对象)”同步代码块格式进行同步操做时,对象监视器必须是同一个对象。若是不是同一个对象监视器,运行的结果就是异步了。

 

细化三个结论

静态同步synchronized方法与synchronized(class)代码块

  关键字synchronized还能够应用在static静态方法上,若是这样写,那就是对当前的。*.jave文件对应的Class类进行持锁,测试项目在synStaticMethod中.

相关文章
相关标签/搜索