---恢复内容开始---
锁定和监视
只要有实例就会相对有一个锁定。因此不是说因为某个实例的synchronized方法正在执行中,导致无法执行其他的实例的synchronized方法
线程共享互斥的架构称为监视(monitor),而获取锁定有时也称为“持有监视”(own)
synchronized阻挡
只想启动方法里一部分的线程,而非启动整个方法时 则可以启动synchronized阻挡
synchronized(){
....
}
则可以把获取锁定的实例传给“表达式”这部分。如果更精密控制共享互斥的范围,则需要使用synchronized阻挡
synchronized方法和synchronized阻挡
synchronized void method(){
、、、
}
在功能上,它跟下面这个synchronized阻挡为主的方法有异曲同工之妙
void method(){
synchronized(this){
..
}
}
换句话说,synchronized实例方法是使用this锁定去做线程的共享互斥
synchronized类方法和synchronized阻挡
假设现在有一个synchronized类方法,synchronized有限制同时只能让一个线程执行这个部分跟synchronized实例方法一样。但是利用synchronized类方法的锁定跟利用synchronized实例方法并不相同
class something{
static synchronized void methods(){
。。。。
}
}
在功能上它跟下面方法有异曲同工之妙
class something{
static void method(){
synchronized(something.class)
}
}
换句话说,synchronized类方法是使用该类的类对象的锁定去做线程的共享互斥。something.class是对应something类的java.lang.Class类的实例
synchronized语句
Java规格 The Java Language Specification则是把synchronized阻挡叫synchronized语句 (synchronized statement)
线程的协调
简单型的共享互斥:当有一个线程正在执行synchronized方法时,其他线程无法执行该方法。
等候:若该空间有空闲则写入数据,若非空闲则等候直到空出为止
通知:当该空间已空出,则通知正在等候的线程
wait 让线程乖乖等候notify notifyAll 启动等候中线程的方法
wait set 线程的休息室
所有实例都有一个wait set 是一个在执行该实例的wait方法时,操作停止的线程的集合
执行wait方法时 线程便会暂时停止操作 进入wait set 除非
1.有其他线程以notify方法唤醒该线程
2.有其他线程以notifyAll唤醒该线程
3.有其他线程以interrupt方法唤醒该线程
4.wait方法已经到期
obj.wait();
则目前的线程会暂时停止执行,进入 obj的wait set 这个操作称为:线程在obj的wait
如果实例方法里还有如下的语句 wait();则其意义同 this.wait();
故执行wait()的线程就会进入this的wait set 此时 就变成了线程在this上的wait
如欲执行wait()方法,线程需获取锁定(这是规则),但是当线程进入wait set时 ,已经释放了该实例的锁定。
wait set
一个虚拟的概念 它既不是实例的字段 也不是可以获取在实力上wait中线程列表的方法