1、synchronize同步语句块的好处
synchronized可以处理长时间的任务,避免直接加在方法上面所消耗的时间。只需要在所需要同步的地方加上同步的语句块就可以实现了
例1、synchronized加在方法上面
这样会导致多个线程执行的,都需要等待前面的线程执行完才可以进行执行
例2、使用同步语句块synchronized(this)进行处理
多个线程执行,最终所消耗的时间就大概是3秒,而打印时间的时候并不会出现变量不同步,里面需要定义私有变量用于接收防护的数据,因为私有变量是线程所具有的,不存在数据的多线程问题
2、synchronized(this)代码块是锁定当前对象的
synchronized同步方法
1)对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态
2)同一时间只有一个线程可以执行synchronized同步方法中的代码
synchronized(this)同步代码块
1)对其他synchronized同步方法或synchronized(this)同步代码块调用呈阻塞状态
2)同一时间只有一个线程可以执行synchronized(this)同步代码块中的代码
synchronized(非this对象x)
1)在多个线程持有"对象监视器"为同一对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码
2)当持有"对象监视器"为同一对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码
静态同步synchronized方法
这个是Class锁,所有调用静态方法的对象都会呈现出同步的效果。而没有加在静态方法的的synchronized的方法,是对象的锁,这个锁和Class锁不一样,故可以与静态的synchronized方法实现异步执行效果
synchronized(class)同步代码块和静态同步synchronized方法效果相同
使用String对象作为同步代码块的"对象监视器"的时候,需要注意常量池的特征,防止对通过对象加锁。
String a = "a";
String b = "a";
System.out.print(a == b);
这个运行的结果是:true
故对对象加锁时,表示是同一个锁