线程学习记录-synchronized 初探
synchronized是有锁升级的概念,它代表三种类型的锁
- 偏向锁
- 轻量级锁
- 重量级锁
jdk1.6之前,synchronized其实都是os锁
重量级锁(os):
-
重量级锁是操作系统级别的锁,它的执行过程类型下面的linux函数调用过程
pthread_mutex_t
mt mt理解为int类型pthread_mutex_t_init(mt)
0 mt初始化为0pthread_mutex_t_lock(mt)
1 mt变成1pthread_mutex_t_unlock(mt)
0 mt变成0
-
他有什么用,为什么1.6以后要优化它 重点:sync os锁,它是互斥锁,也就是互斥场景都需要它
-
但是,如果不需要资源和竞争,是不是可以不用互斥锁,所以有了偏向锁。
偏向锁
简单理解为栈中保存获得锁的线程id,如果有其他线程来争夺锁,就会膨胀升级,
偏向锁只有在第一次获取锁时才会调用操作系统函数。
怎么证明偏向锁存在呢?
- 写好java的同步方法,只有一个线程执行该方法。
- 修改linux源码,当
pthread_mutex_lock()
被执行时,打印对应线程id - main方法启动后,其实会有许多jvm自动开启的线程运行并加锁,如何找到同步方法的执行线程id?
- 我们可以在java方法中,打印当前开启的线程id。比较java和linux的打印结果。