This锁:

关于什么是This锁下面用实现来说明一下它:

java线程基础巩固---通过实验分析This锁和Class锁的存在_静态代码块

那下面用两个线程分别调用这两个方法,如下:

java线程基础巩固---通过实验分析This锁和Class锁的存在_同步锁_02

看结果:

java线程基础巩固---通过实验分析This锁和Class锁的存在_多线程_03

可见两个方法是同时输出的,因为m2()方法并未上锁,所以就不存在争锁的问题,那这时给m2()方法也加上同步锁,如下:

java线程基础巩固---通过实验分析This锁和Class锁的存在_多线程_04

那此时两个线程调用的m1()、m2()方法能同时执行么,看结果:

java线程基础巩固---通过实验分析This锁和Class锁的存在_多线程_05

很显然这次就不是同时执行了,而是哪个线程抢到了锁谁就执行,而另外一个方法则会等待锁释放了再执行,其时这个同步方法上的锁就是This锁,下面咱们手动定义一个锁,将程序再改造改造:

java线程基础巩固---通过实验分析This锁和Class锁的存在_同步锁_06

也就是说两个方法的锁不一样,那结果如何呢?

java线程基础巩固---通过实验分析This锁和Class锁的存在_静态代码块_07

因为两个方法是不同的锁,所以当然各自都可以执行喽,同样如果将m1()方法的This锁改为咱们自己写的锁:

java线程基础巩固---通过实验分析This锁和Class锁的存在_多线程_08

其结果应该跟同时加了This锁一样,谁先抢到锁谁就执行方法,而没抢到的则需等待锁释放之后才能执行,如下:

java线程基础巩固---通过实验分析This锁和Class锁的存在_多线程_09

其实This锁很好理解,This当然是锁的同一个对象嘛,而声明在实例方法上的同步锁当然也就是This锁喽。

【注意】:所以关于同步锁要想让多线程执行的不同方法达到同步的效果则必须上的是同一把锁才行。

Class锁:

跟This锁类似,Class锁顾名思议就是锁的一个类本身,而非类的实例,下面举例说明:

java线程基础巩固---通过实验分析This锁和Class锁的存在_同步锁_10

接下来用两个线程分别调一下这两个方法,并看结果:

java线程基础巩固---通过实验分析This锁和Class锁的存在_同步锁_11

那如果再定义一个m3()方法,然后它不加锁,这时再开启一个线程来执行它,如下:

java线程基础巩固---通过实验分析This锁和Class锁的存在_多线程_12

java线程基础巩固---通过实验分析This锁和Class锁的存在_多线程_13

其结果可想而知:m3()肯定立马就可以执行到喽,如下:

java线程基础巩固---通过实验分析This锁和Class锁的存在_静态代码块_14

而对于static静态代码块我想应该都很熟悉,像JNI调用加载so库不就是在它里面执行的么,接下来在它里面也加个同步锁看看效果:

java线程基础巩固---通过实验分析This锁和Class锁的存在_静态代码块_15

这时再看m3()方法能否立马能执行:

java线程基础巩固---通过实验分析This锁和Class锁的存在_静态代码块_16

可见m3()并未立马执行,因为首先得执行完静态代码块之后,才能到静态方法,虽说m3()木有加静态锁。