多线程等待唤醒机制:从wait()和sleep()的差别说起

1.

wait():释放资源,释放锁

sleep():释放资源,不释放锁


wait():Object的方法,用在同步当中,是同步锁的方法,以锁控制线程

sleep():线程类Thread本身的静态方法

wait(),notify(),notifyAll()方法是用在同步当中的:必须是同步当中的同一把锁操作线程。所以这几个方法是Object的方法。试想想不在同步中的多线程,由于抢夺执行权结果不定,控制无意义,线程间也无法通信:怎样知道当前是哪个线程呢?怎样捕获这个线程操作它呢?


同步的窍门:如果加了同步还有线程安全问题,想两个前提:1,是不是两个或两个以上线程 2.用的是不是同一把锁

只同步了一个线程的代码是不行的,要将所有线程运行的代码都用同一把锁同步,这样一个执行同步代码,其他的判断同一把锁,才无法进入自己执行的代码

即使在一个Runnable的操作代码中是一句, 要同步的也不是一句:是几个要同步的线程要操作的所有代码


例子:

class Person
{
	String name;
	String gender;
	boolean flag=false;//标记,默认不输出
}
class Input implements Runnable
{
	private Person p;
	private int n=0;
	public Input(Person p){
		this.p=p;
	}

	public void run(){
		//别忘了while(true)!!
		while(true){
		synchronized(p){//两个Runnable用同一个Person初始化,就可保证p是同一个且唯一
			if(p.flag){
				try{p.wait();}catch(InterruptedException e){}
				
			}
			//not "else"
			if(n==0){
				p.name="Jason";
				p.gender="男";
			}else{
				p.name="Lily";
				p.gender="女";
			}
			n=(n+1)%2;
			p.flag=true;//修改标志位
			p.notify();//唤醒另一个
		}
		}
	}

}

class Output implements Runnable
{
	private Person p;
	public Outpu
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值