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

关于java中的synchronized、wait以及notify和notifyAll

2014-04-08 20:58 429 查看
1.java中多线程同步方法有很多种,可以使用volatile、synchronized同步方法和同步块,以及java内置的一些类和库,如:AtomicInteger类,java.util.concurrent中的类,这些都多提供了同步功能,可以使得在多线程环境中高效而安全的实验我们自己所需要的功能。下面简单介绍synchronized、lock以及notify和notifyAll。

2.首先介绍synchronized,该词的意思是同步的,同步化的。该关键字可用在方法的前面,作为方法的修饰符,可以保证同一时刻只有一个线程执行这个方法,除此之外,还能保证一个类的所有被synchronized修饰的方法中只有一个正在被执行,不会出现在同一时刻不同线程同时在执行这些方法(每个线程执行的是被synchronized修饰的不同的方法)。
另外,还可以用synchronized包围代码块(具体用法请上网查),只要synchronized的同步锁是同一个对象,那么就可以保证这些代码块不会同时被多个线程执行(同一个代码块不会同时被多个线程执行,而且不同代码块也不会被多个线程同时执行)。

3.notify,notifyAll,wait方法必须在该对象的同步代码块内,不然会发生IllegalMonitorStateException异常,实际中需要像下面这样

synchronized (lock) {
lock.wait()
}


另外需要说明的是,当调用wait方法后,lock所在的代码块会自动释放所拥有的锁lock对象,并且等待某个线程调用notify或者notifyAll方法后再去获得lock锁,然后继续执行。如果wait中有参数,那么当参数所表示的时间后还没有线程调用notify等方法,那么同步代码块会结束等待,然后继续运行。

4.notify和notifyAll的区别

调用notify方法:只通知所有wait的线程中的一个线程结束等待,至于具体是所有等待线程中的哪一个线程有系统决定。而调用notifyAll方法,所有wait的线程都将结束等待,准备执行。

5.得出上述结论所用到的实验代码如下,希望对理解上面的文字有帮助。

public class JavaSynchronization {

/**
* @param args
*/
public static void main(String[] args) {
final JavaSynchronization instance=new JavaSynchronization();
try {
synchronized (instance) {
instance.wait(100);

}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
new Thread(new Runnable() {

@Override
public void run() {
instance.methodA();
}
}).start();

new Thread(new Runnable() {

@Override
public void run() {
instance.methodB();
}
}).start();

}

private char share=0;
private Object lock=new Object();
public void methodA(){
synchronized (lock) {
System.out.println("methodA开始了!");
share='A';
while(true){
try {
lock.wait();
System.out.println("methodA又继续了!");
Thread.yield();
} catch (Exception e) {
e.printStackTrace();
}
if(share!='A'){
System.out.println("methodA结束了!");
return ;
}
}

}
}

public void methodB(){
synchronized (lock) {
System.out.println("methodB开始了!");
share='B';
while(true){
try {
//					lock.notify();
Thread.yield();
} catch (Exception e) {
e.printStackTrace();
}
if(share!='B'){
System.out.println("methodB结束了!");
return ;
}
}

}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: