多线程学习笔记2

1.monitorenter

每一个对象都与一个monitor相关联,一个monitor的lock的锁只能被一个线程在同一时间获得。在一个线程尝试获得与对象关联monitor的所有权时会发生如下的几件事情:

①如果monitor的计数器为0,则意味着该monitor的lock还没有被获得,某个线程获得之后将立即对该计数器加一,从此该线程就是这个monitor的所有者

②如果一个已经拥有该monitor所有权的线程重入,则会导致monitor计数器再次累加

③如果monitor已经被其他线程所拥有,则其他线程尝试获得该monitor的所有权时,会被陷入阻塞状态直到monitor计数器为0,才能再次尝试获取对monitor的所有权

2.monitorexit

释放对monitor的所有权,想要释放对某个对象关联的monitor的所有权的前提是,你曾经获得了所有权

3.使用synchronized需要注意的问题

①与monitor关联的对象不能为空
②synchronized作用域不能太大
③不同的monitor企图锁相同的方法
④多个锁的交叉导致死锁

4.this Monitor & class Monitor(结合jstack命令分析)

调用同一个类中的两个synchronized方法或代码块会存在lock争抢,无论方法是否为static

static方法通过class互斥
非static通过对象(this)互斥

5.程序死锁

①交叉锁可导致程序出现死锁(哲学家吃面)
②内存不足,等待内存释放
③一问一答式的数据交换(加超时限制)
④数据库锁
⑤文件锁
⑥死循环引起的死锁(系统假死)

发表回复

您的电子邮箱地址不会被公开。

16 − 10 =