您的位置:首页 > 编程语言 > Java开发

java同步和互斥 : 线程之间通信

2013-06-05 23:59 351 查看
http://www.mianwww.com/html/2011/10/10792.html

java同步和互斥 : 线程之间通信

举例:男孩和女孩例子,每个女孩是一个对象,每个男孩是个线程。每个女孩都有自己的锁池。每个男孩可能在锁池里等待。

Class Girl{

Public void hand(){

}

Public syncronized void kiss(){

}

}

Class Boy extends Thread{

Public void run(){

}

}

锁标记如果过多,就会出现线程等待其他线程释放锁标记,而又都不释放自己的锁标记供其他线程运行的状况。就是死锁。

死锁的两种处理方法

统一排列锁顺序(解决不同方法中对多个共享资源的访问)

对象1的方法

synchronized(a)

synchronized(b)

对象2的方法

synchronized(a)

synchronized(b)

2.线程间通信(也就是线程间的相互协调)

线程间通信使用的空间称之为对象的等待池(wait pool),该队列也是属于对象的空间的。

进入等待池

使用Object类中wait()的方法,在运行状态中,线程调用wait(),此时表示线程将释放自己所有的锁标记和CPU的占用,同时进入这个对象的等待池。等待池的状态也是阻塞状态,只不过线程释放自己的锁标记。

退出等待池进入锁池

notify():将从对象的等待池中移走一个任意的线程,并放到锁池中,那里的对象一直在等待,直到可以获得对象的锁标记。

notifyAll(): 将从等待池中移走所有等待那个对象的线程并放到锁池中,只有锁池中的线程能获取对象的锁标记,锁标记允许线程从上次因调用wait()而中断的地方开始继续运行

注意:只能对加锁的资源进行wait()和notify()。

1) wait():交出锁和CPU的占用;

2) notify():将从对象的等待池中移走一个任意的线程,并放到锁池中,那里的对象一直在等待,直到可以获得对象的锁标记。

3) notifyAll(): 将从等待池中移走所有等待那个对象的线程并放到锁池中,只有锁池中的线程能获取对象的锁标记,锁标记允许线程从上次因调用wait()而中断的地方开始继续运行

注:在java.io包中Vector 和 HashTable 之所以是线程安全的,是因为每个方法都有synchronized修饰。Static 方法可以加 synchronized , 锁的是类对象。

但是Vector 是 jdk 1.0 的 ArrayList 是 jdk1.2 所以实际应用还是使用ArrayList

例子:

生产者和消费者

一个柜台一定数量的产品,柜台满时不能生产,空时不能够买。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: