您的位置:首页 > 其它

3.1.4在notify方法执行完之后不立即释放锁

2017-10-15 23:39 239 查看
package demo;

/**
* Created by sunyifeng on 17/10/15.
*/
public class Service {
// wait方法
public void waitMethod(Object lock) {
try {
synchronized (lock) {
System.out.println("开始等待,线程名称:"+ Thread.currentThread().getName());
lock.wait();
System.out.println("结束等待,线程名称:"+ Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

// notify方法
public void notifyMethod(Object lock) {
try {
synchronized (lock) {
System.out.println("开始通知,线程名称:" + Thread.currentThread().getName());
lock.notify();
Thread.sleep(5000);
System.out.println("结束通知,线程名称:" + Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

package demo;

/**
* Created by sunyifeng on 17/10/15.
*/
public class MyThread extends Thread {
private Object lock;

public MyThread(Object lock) {
super();
this.lock = lock;
}

@Override
public void run(){
Service service = new Service();
service.waitMethod(lock);
}
}

package demo;

/**
* Created by sunyifeng on 17/10/15.
*/
public class NotifyThread1 extends Thread {
private Object lock;

public NotifyThread1(Object lock) {
super();
this.lock = lock;
}

@Override
public void run(){
Service service = new Service();
service.notifyMethod(lock);
}
}

package demo;

/**
* Created by sunyifeng on 17/10/15.
*/
public class NotifyThread2 extends Thread {
private Object lock;

public NotifyThread2(Object lock) {
super();
this.lock = lock;
}

@Override
public void run(){
Service service = new Service();
service.notifyMethod(lock);
}

}

package demo;

/**
* Created by sunyifeng on 17/10/15.
*/
public class Run {
public static void main(String[] args) {
Object lock = new Object();
//
MyThread myThread = new MyThread(lock);
myThread.start();
//
NotifyThread1 notifyThread1 = new NotifyThread1(lock);
notifyThread1.start();
//
NotifyThread2 notifyThread2 = new NotifyThread2(lock);
notifyThread2.start();
}
}

运行结果:

开始等待,线程名称:Thread-0

开始通知,线程名称:Thread-1

结束通知,线程名称:Thread-1

结束等待,线程名称:Thread-0

开始通知,线程名称:Thread-2

结束通知,线程名称:Thread-2

程序分析:

方法notify()执行后不立即释放锁,必须等到所在同步块执行完之后才释放锁。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐