youyichannel

志于道,据于德,依于仁,游于艺!

0%

Synchronized全解读-02

synchronized特性

1)有序性

类型
互斥 互斥
互斥 互斥

2)可见性

可见性是指多个线程访问同一个资源时,该资源的状态、值信息等对于其他线程是可见的。

synchronizedvolatile都具有可见性。

synchronized对一个类或者对象加锁时,一个线程如果想要访问共享资源,必须先获得锁,这个锁的状态对于其他线程都是可见的,并且在释放锁之前会将对应的变量修改刷新到共享内存中,保证资源变量的可见性。

3)原子性

本质上是线程互斥保证了原子性。

4)可重入性

示例代码:

public class SyncReIn implements Runnable {

static SyncReIn sync = new SyncReIn();
static int i = 0;
static int j = 0;

public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(sync, "Thread - 1");
Thread t2 = new Thread(sync, "Thread - 2");
t1.start();
t2.start();

t1.join();
t2.join();

System.out.println("i = " + i);
System.out.println("j = " + j);
}

@Override
public void run() {
for (int k = 0; k < 100_0000; k++) {
// 锁的是当前实例对象sync
synchronized (this) {
i++;
increase();
}
}
}

// 演示synchronized的可重入性
synchronized void increase() {
j++;
}
}

输出结果:

i = 2000000
j = 2000000

上述结果表明t1、t2线程都进入了同步代码块,证明了可重入。

synchronized锁升级 —— MarkWord

32位虚拟机

资料:https://www.bilibili.com/video/BV1He411f7jX/ 强推 河北王校长