多线程笔记——3
线程间的通信
1等待唤醒机制
wait notify是object类的方法,该方法用来将当前线程置入“预执行队列”,并在wait处停止执行直到被唤醒才继续执行
执行wait()方法,线程必须获得该对象的对象级别的锁,否则会抛出IllegalMonitorStateException.
wait 方法释放锁 sleep 方法不释放锁 notify 被执行后不释放锁,必须执行完notify所在的同步代码块才释放锁
2 生产者消费者 的 假死问题
出现假死问题的原因就是有可能连续唤醒同类
解决办法 及时使用 waitAll 和 notifyAll
3 通过管道通信
字符流 PipReader PipWrite
字节流 PipInputStream PipOutPutStream
4 join方法
join(long) 与sleep(long) join内部使用的是wait(long)方法,所以具有释放锁的特点
5 ThreadLocal 的使用
Lock的使用
ReentrantLock类
lock.lock() 与locl=k.unlock()
Condation与lock结合可以实现选择性通知 condation.await() 与 condition.signal()
公平锁与非公平锁
公平锁表示线程获取锁的顺序是按照加锁的顺序来分配的 ,非公平锁就是一种获取锁的抢占机制,是随机获取的。
公平锁 ReentrantLock lock = new ReentrantLock (true);
非公平锁ReentrantLock lock = new ReentrantLock (false);
RerntrantReadWriteLock 读写锁
读读共享 写写互斥 读写互斥