Java精通并发-synchronized关键字原理详解

时间:2022-02-24 16:01:17

关于synchronized关键字原理其实在当时JVM的学习【https://www.cnblogs.com/webor2006/p/9595300.html】中已经剖析过了,这里从研究并发专题的角度再来审视一下它,毕境对于并发它是非常之重要的,下面先来看一下程序:

Java精通并发-synchronized关键字原理详解

然后运行,其结果会不定的,有正常依次按顺序执行直到程序退出的,如下:

Java精通并发-synchronized关键字原理详解

也有不如预期的,如:

Java精通并发-synchronized关键字原理详解

Java精通并发-synchronized关键字原理详解

写这个程序的目的其实并不是说同步的问题,而是关于多线程如果对象中存在一个可修改的变量,对于多线程是可以被共享的,所以上面结果的不稳定心就是由于多个线程可以针对同一个成员变量进行修改所导致,要解决那当然用同步就可以解决,这里就不多说了。

接下来看第二个例子:

Java精通并发-synchronized关键字原理详解

然后再来编写两个线程类:

Java精通并发-synchronized关键字原理详解

接下来调用一下:

Java精通并发-synchronized关键字原理详解

那,到底是先输出的“hello”,还是先输出的"world"呢?其实比较容易看出来,肯定是先输出hello,因为有同步锁机制在里面,如下:

Java精通并发-synchronized关键字原理详解

简单分析一下:

Java精通并发-synchronized关键字原理详解

而等它执行完之后,线程二的world方法才能得到执行,所以结果就如上面所示了。

那程序改造一下:

Java精通并发-synchronized关键字原理详解

很明显同步锁机制不会发挥作用了,所以肯定会先输出world了,如下:

Java精通并发-synchronized关键字原理详解

比如容易理解,因为没有了同步了之后,那各自可以随意执行了,不受限同步的限制了。

其实这些知识是比较简单的,但是!!是个非常基础也非常重要的点,也就是同步锁只能针对同一个对象而言,而不同的对象是不可能有同步效果的。