首页 > 代码库 > 多线程(第二天)

多线程(第二天)

---恢复内容开始---

锁定和监视

只要有实例就会相对有一个锁定。因此不是说因为某个实例的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中线程列表的方法

 

多线程(第二天)