相关博客:

​​再看 synchronized​​

避免多个线程同时竞争一把锁

一个线程想要执行synchronized代码体中的代码:
1.尝试获得锁;

2.如果拿到锁,执行synchronized代码体内容:拿不到锁,这个线程就会不断的尝试获得这把锁,直到拿到为止,会是多个线程同时去同时竞争这把锁(会有竞争问题);

(有个问题是如果抢占锁的线程过多,这样对CPU的资源消耗极大,所以要避免多个线程同时竞争一把锁,可以将sleep的时间随机数量)

注意当前锁对象

这里有一个示例:

使用synchronized要注意的地方_随机数

执行结果:

使用synchronized要注意的地方_随机数_02

明显已经在testPrintNum()方法上加上了synchronized关键字,但是执行结果显示是最终依然是异步执行的代码。第一个线程携带着参数“a”进入方法后,第二个线程同样也携带着“b”进入了方法。

这是因为这个方法是非static的,也就是说相当于是加的对象锁,而我们在实际执行的时候new了两个SyncTest对象,所以这个时候synchronized失效了,解决方法是可以讲synchronized的方法设置为static的,这样相当于是类级别的锁。

使用synchronized要注意的地方_对象锁_03

再看看下面这个例子:

使用synchronized要注意的地方_解决方法_04

执行结果:

使用synchronized要注意的地方_对象锁_05

两个方法是异步执行的,因为第二个方法没有被synchronized修饰,是不需要获得锁的。如果给第二个方法加上synchronized关键字,那么两个方法就会同步执行,因为这个时候synchronized是对象锁,第二个方法需要等待第一个方法释放对象锁。

使用synchronized要注意的地方_解决方法_06

执行结果:

使用synchronized要注意的地方_随机数_07