1、多线程的互斥
Java语言中为保证线程对共享资源操作的完整性,用关键字synchronized为共享资源加锁来解决。
Java语言一定要保证线程对共享资源的协调操作及其操作的完整性,关键字synchronized的运用在其中起着重要的作用,它相当于给共享对象的成员方法加上一把锁,通过调用来单一执行线程,其他线程则不能同时调用同一个对象的加锁方法,所以synchronized又叫做互斥锁。关键字synchronized的使用有以下几种形式:
(1) public void push(char c){
synchronized(this){ //加在代码段前限制代码
data[index]=c;
index++;
}
}
用synchronized修饰的语句被加上了互斥锁,避免进栈和出栈操作同时进行,使得进栈完成后,才可以出栈。
(2)另外,synchronized可以放在方法声明中修饰方法:
public synchronized void push(char c){
…….. //加在方法前修饰方法
}
(3)若用在类声明中,类中所有方法都是互斥资源。
例题:thread5.java(没加锁),thread6.java(加锁)
2、多线程的同步
Java通过wait()和notify()(或notifyAll())方法来实现线程之间的相互协调。wait()方法可以使线程释放互斥锁进入等待状态。当其他线程释放资源时,会调用notify()(或notifyAll())方法唤醒等待队列中的线程,使其得到资源恢复运行。
生产者和消费者模型是典型的线程同步问题。如:pctest.java,pctestcorrect.java。
这些方法说明如下:
(1)wait(),notify()和notifyAll()必须在已经持有锁的情况下执行,所以它们只能出现在synchronized作用的范围内。
(2)wait()的作用是释放已经持有的锁,进入等待队列。
(3)notify()的作用是唤醒队列中第一个线程并把它移入锁申请队列。
(4)notifyAll()的作用是唤醒队列中所有线程并把它们移入锁申请队列
因篇幅问题不能全部显示,请点此查看更多更全内容