<七周七并发模型>笔记
chp2
共享变量解决冲突
加锁
多个共享资源
加多个锁,但加多个锁必然可能导致死锁
死锁
保证上锁顺序
外星方法
即调用者不知道其实现的方法
问题:如果调用者已经加锁,再调用外星方法,这个方法如果有锁,就很有可能死锁,解决方法是调用方法前对调用者进行一次保护性复制(对象),然后在进行调用
解决死锁
使用ReentrantLock
锁有超时事件,超时会放弃所拥有的锁
但是这样并不能完全解决死锁问题,这种方案会产生活锁现象,当所有死锁同时超时,那么下次再获得锁时,很有可能会继续死锁
通过设置不同的超时事件可以减少活锁的概念
###交替锁
###条件锁
###原子变量
atomic包
###自学内容
###公平锁与非公平锁
公平锁: 线程按照先来后到的方式获取锁
非公平: 线程竞争,没获取到锁的线程会被压进队列,但是,压进队列的线程依旧会被后到的线程抢到锁
公平锁和非公平锁的区别是性能,非公平锁的性能回事公平锁的5~10倍
(数据来源: http://www.majin163.com/2014/03/17/synchronized2/)
###虚假唤醒(spurious wakeup)
就算没人调用signal,await还是有可能会被调用
所以用while等待条件满足唤醒,就算被虚假唤醒了,因为要判断一次条件,所以也能避免虚假唤醒造成的问题
###为什么synchronize比reentrantlock慢
因为syn是悲观锁,reentrantlock是乐观锁
独占锁意味着其他线程只能依靠阻塞来等待线程释放锁。而在CPU转换线程阻塞时会引起线程上下文切换,当有很多线程竞争锁的时候,会引起CPU频繁的上下文切换导致效率很低
http://blog.csdn.net/natian306/article/details/18504111
最佳方案
使用线程池
实际使用中极少会直接创建线程
线程池大小?