您的当前位置:首页正文

多线程的互斥与同步

来源:九壹网


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()的作用是唤醒队列中所有线程并把它们移入锁申请队列

因篇幅问题不能全部显示,请点此查看更多更全内容

Top