Java多线程编程核心技术-读书笔记20220627

115 阅读2分钟

2.2.1synchronized方法的弊端

耗时会明显增加

2.2.2synchronized同步代码块的使用

当两个并发线程访问同一个对象Object中的synchronized(this)同步代码块是,一段时间内只能有一个线程被执行,另一个线程必须等待当前线程执行完这个代码块之后才能执行该代码块。

2.2.3用同步代码块解决同步方法的弊端

当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象的非synchronized(this)同步代码块。

2.2.4一半异步,一半同步

结论:不在synchronized块中的就是异步执行,在synchronized块中就是同步执行。

2.2.5synchronized代码块间的同步性

使用synchronized(this)代码块需要注意,当一个线程访问object的一个synchronize的(this)同步代码块时,其他线程对同一个object中所有其他synchronized(this)同步代码块的访问将被阻塞,

这说明synchronized使用的“对象监视器”是一个。

2.2.6synchronized(this)代码块是锁定当前对象的

2.2.7将任意对象作为对象监视器

synchronized同步方法或synchronized(this)同步代码块分别有两种作用:

(1)synchronized同步方法

1)对其他synchronized同步方法或synchronized(this)同步代码块

调用呈阻塞状态。

2)同一时间只能有一个线程可以执行synchronized同步方法中的代码。

(2)synchronized(this)同步代码块

1)对其他synchronized同步方法或synchronized(this)同步代码块调用呈现阻塞状态。

2)同一时间只有一个线程可以调用synchronized(this)同步代码块中的代码。


根据前面可总结,synchronized(非this对象)格式的作用只有1种:synchronized(非this对象x)同步代码块

1)在多线程持有“对象监视器”为同一个对象的前提下,同一个时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码。

2)当持有“对象监视器”为同一个对象的前提下,同一个时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码。


锁非this对象具有一定的有点:

如果在一个类中有很多个synchronized方法,这时虽然能实现同步,但是会受到阻塞,索引会影响效率;

但是如果使用同步代码块锁非this对象,则synchronized(非this)代码块中的程序与同步方法是异步的,不与其他锁this同步方法争抢this锁,则可以大大提高效率。

使用synchronized(非this对象x)同步代码块格式进行同步操作时,对象监视器必须使同一个对象。如果不是同一个对象监视器,运行的结果就是异步调用,就会交叉运行。

\