多线程的同步

public class TestWatiNotify {
public static Object obj = new Object();


public static void main(String[] args) {
Thread1 t1 = new Thread1();
t1.setName("线程1");
Thread2 t2 = new Thread2();
t2.setName("线程2");
t1.start();


// try {
// Thread.sleep(100);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }


t2.start();
}


static class Thread1 extends Thread {
@Override
public void run() {
synchronized (obj) {
System.out.println("调用wait方法前");
try {
//wait方法将当前线程置入休眠状态,知道被通知或中断为止,
// 在调用wait()方法前,必须获取对象级别锁,因此它只能在同步方法和同步块调用。
// 当调用wait()方法,当前线程释放锁,在从wait()方法返回前,线程与其他线程竞争重新获得锁。
obj.wait();// 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName()
+ "获取到锁");
}
}
}


static class Thread2 extends Thread {
@Override
public void run() {
synchronized (obj) {
// 该方法也要在同步方法和同步块中调用,在调用前必须获得对象级别锁,没有则抛出异常。 
// 该方法用来通知那些等待该对象的对象锁的其他线程,如果有多个线程等待,
// 则挑选出一个其中出于wait状态的线程来发出通知,
// 并使得它获取对象锁。(执行notify方法后,当前线程并不会马上释放该对象锁,
// 要等到程序退出synchronized代码块后,当前线程才可以释放对象锁,
// 处于wait状态的线程才可以获取该对象锁) 
obj.notify();//   唤醒在此对象监视器上等待的单个线程。
System.out.println("线程" + Thread.currentThread().getName()
+ "调用了notify方法");
}
System.out.println("线程" + Thread.currentThread().getName()
+ "释放了该锁");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() + "结束");
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值