2、synchronized关键字
1.引出synchronized
在java中,当使用多线程操作共享资源时,很容易出现数据不一致问题。
场景: 当售票时,很多窗口同时售票,但去往一个目的的票数总共只有100张,当200人同一时间买该目的地票时,如何控制不会出现超卖、少卖的情况呢?
这个时候我们需要控制不管谁买到了票,另外的所有人都会看到票总数在减少,直至售完。
synchronized 故名思意是用来做数据同步的,被其修饰的代码块是具有原子性的。
原子性即:该操作是不可拆分的。
2.synchronized用法
java中,我们通常会理解synchronized是用来锁住共享资源的。
在java中,synchronized可以锁对象,锁方法,代码块,锁的开始和结束部分之间的操作都是原子性操作。
3.synchronized原理分析
在java中,每个对象都有一个monitor对象,这个对象其实就是java对象的锁。通常认为是内置锁。
当某个线程占有某个对象的时候,先判断该对象monitor的计数器是不是0,为0则没有线程占有,此时占有这个对象,并且将对象monitor的计数器加1。如果monitor不为0,表示这个对象已经被其他线程占用。
使用jconsole查看线程运行状态
使用jstack pid查看线程运行状态
javap反编译
锁对象
锁方法
扩展:锁分很多种,偏向锁、轻量级锁、重量级锁、无锁有待仔细考量。