不知你想问什么:是希望互锁? 还是希望避免互锁?
一般来讲,是不希望互锁。即避免互相等待对方已经拥有的锁资源。比如有两个线程t1和t2,同时有两个锁m1,m2;在某个时刻,t1已经拥有锁m1,而t2已经拥有锁m2,接下来t1试图获得锁m2,并处于等待状态,而t2试图去获得锁m1,也处于等待状态。这种状况就是互锁,或者也叫死锁。
要想避免互锁或者死锁,良好的设计和规范的编码是很必要的,比如设计期间就要制定一个统一的协议,即m1,m2锁所保护的资源划归一个域,那么凡是在同一个域进行 *** 作的线程都必须遵循相同的步骤去访问和修改资源。比如对待m1,m2来讲,凡是访问他们的线程都遵循先获取m1然后再获取m2的规则,这样就可以有效避免互锁和死锁。
一句话:三个和尚打水喝!打个比喻桶就是锁,拿到桶的人不会渴死,多线程就是你拿一会,我拿一会,线程等待就是一个和尚喝了一会,别的和尚在等,可能能喝到水。死锁就是三个和尚互相打架,都拽着对方的手谁都喝不到,睡眠就是一个和尚说我可以让别人先喝,自己去睡会觉去,回来后还得看别人的脸色。
我觉得应该是这样吧:在main()方法中的确开了一个子线程,但是cpu给主线程分配的时间还没有用完,主线程继续向下进行,进入同步方法m2(),但是遇到线程睡眠,所以cpu切换到子线程执行,当要进入同步方法m1()时,因为m1()与m2()都用对象tt的锁,所以没法进入m1();子线程阻塞,cpu再次切换到主线程,所以先输出m2()的结果。
以上就是关于java多线程如何互锁全部的内容,包括:java多线程如何互锁、java中多线程的锁是什么概念谁能一言以蔽之、java线程锁的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)