synchronized(this)、synchronized(class)与synchronized(Object)的区别
在多线程开发中,我们经常看到synchronized(this)、synchronized(*.class)与synchronized(任意对象)这几种类型同步方法。但是是否知道这几种写法有什么区别了?下面根据代码来分析:
DEMO1.synchronized代码块间的同步性:
以下为建立的实例代码:
模拟一个工具类:提供吃水果服务
从上面的运行结果可以得出:当一个线程访问EatFruitService的的一个同步(synchronized(this))的代码块时,其他线程对同一个EatFruitService的其他的同步(synchronized(this))的代码块的访问是阻塞的,这说明synchronized(this)使用的对象监视器是同一个。
DEMO2.验证synchronized (this)代码块是锁定当前对象
可以看到吃苹果的动作并没有如向计划的那样进行执行,而是直接进行了异步执行,
下面在在方法eatApple()上加上同步synchronized
DEMO3.验证synchronized (this)代码块是锁定当前对象2
根据上面的三个例子可以知道,多个线程调用同一个对象的不同名称的synchronized同步方法,或synchronized(this)同步代码块时,是同步的。
1、synchronized同步方法
①对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;
②同一时间只有一个线程执行synchronized同步方法中的代码。
2、synchronized(this)同步代码块
①对其它的synchronized同步方法或synchronized(this)同步代码块调用是堵塞状态;
②同一时间只有一个线程执行synchronized同步方法中的代码。
DEMO4.将任意对象作为对象监视器
当我们把锁对象加在方法内,而不是作为对象的成员属性,如下图:
DEMO4.将任意对象作为对象监视器2
运行结果如下:
根据以上运行结果,对比验证得知:多个线程持有的监视器对象是同一个对象的前提下,
同一时间只允许一个线程执行synchronized同步代码块。其中synchronized(lock)中的lock对象可以是任意自定义对象。
DEMO5.synchronized(任意自定义对象)与synchronized同步方法共用
根据以上运行结果可知:
使用synchronized(任意自定义对象)进行同步操作,对象监视器必须是同一个对象。如果不是同一个,运行就是异步执行了。
现在考一下大家,如果将本上面本演示中第一张图lock改成this,运行后是同步吗??
答案是肯定的。
DEMO6.静态同步synchronized方法与synchronized(*.class)代码块
静态同步synchronized方法
Synchronized对静态方法持锁,是对当前的class进行持锁,是同步的,即便对象不同。
DEMO6.静态同步synchronized方法与synchronized(*.class)代码块2
synchronized(*.class)代码块
DEMO6.静态同步synchronized方法与synchronized(*.class)代码块3
上面测试方法是共同对象,下面我们分别实例化一个对象:
结论:
同步synchronized(*.class)代码块的作用其实和synchronized static方法作用一样。Class锁对类的所有对象实例起作用。