1 线程通信
java.lang.Object提供两个用于线程通信的方法:
wait()
执行该方法的线程释放对象锁.把该线程放到对象等待池中.
notify(
执行该方法的线程唤醒在对象的等待池中的一个线程.JVM从对象等待池中随机选择一个线程,把它转移到对象锁池中,
*t1线程 t2线程共同操作一个对象.
两个线程可以通过s对象的wait()和notify()方法通信.
t1线程执行对象s的一个同步代码块,t1线程持有s的锁.t2线程在锁池中等待.
*t1线程在同步代码块中执行s.wait()
t1线程释放对象s的锁,进入对象等待池.
*在对象s的锁池中,等待锁t2线程获得了对象s的锁.执行s对象另一个同步代码块.
*t2线程在同步代码块中执行s.notify()
jvm把t1线程从对象s的等待池.移到对象s的锁池.在那里等待获得锁.
*t2线程执行完同步代码块,释放锁,t1线程获得锁.继续执行同步代码块.
只有在锁池中的线程才有机会获得对象的锁.执行同步代码块.
如果需要获得对象锁.线程需要从等待池--移动-->锁池--进一步-->获得对象锁
释放对象锁:
在以下情况会释放对象锁,持有锁的线程会释放对象锁.
*执行完同步代码块就会释放锁.
*在执行同步代码块过程中遇到异常会导致线程终止.锁也会被释放
*在执行同步代码块过程中.执行锁所属对象wait()
这个线程会释放锁.进入对象等待池中.
如何测试一个方法是线程安全的
一个线程执行临界区代码过程如下
1 获得同步锁
2 清空工作内存.
3 从主内存拷贝变量到工作内存
4 对这些变量计算
5 将变量从工作内存写到主内存
6 释放锁
A的等待是主动放弃锁
B等待时候还要提醒A放鸡蛋
声明了一个盘子只能放一个鸡蛋