LJXColin 2021-02-11 17:23 采纳率: 100%
浏览 40
已采纳

请教大牛,举个活锁的例子,活锁是否在单线程或多线程下都可发生?活锁与死循环有什么区别?

活锁在于线程是“活”的,不阻塞,但却一直忙碌不能完成线程生命周期。有几个疑惑想请教下大家,活锁的发生是否一定需要上锁(synchronized或lock),活锁的demo一般基于不断重试(while(true)或for(;;)),因此个人又认为活锁与死循环类似。请问下大家的理解是怎么样的?

  • 写回答

1条回答 默认 最新

  • allway2 2021-02-11 22:45
    关注
    package DeadlockLivelock;
    
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class Livelock {
    	public static void main(String[] args) {
    		Livelock livelock = new Livelock();
    		new Thread(livelock::action1).start();
    		new Thread(livelock::action2).start();
    	}
    
    	private Lock lock1 = new ReentrantLock(true);
    	private Lock lock2 = new ReentrantLock(true);
    
    	public void action1() {
    		try {
    			while (true) {
    				lock1.tryLock(50, TimeUnit.MILLISECONDS);
    				System.out.println("LOCK 1 ACQUIRED");
    				TimeUnit.MILLISECONDS.sleep(1000);
    
    				if (lock2.tryLock()) {
    					System.out.println("LOCK 2 ACQUIRED");
    				} else {
    					System.out.println("CANNOT ACQUIRE LOCK 2, RELEASING LOCK 1");
    					lock1.unlock();
    					continue;
    				}
    
    				System.out.println("ACTION 1");
    				break;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			lock1.unlock();
    			lock2.unlock();
    		}
    	}
    
    	public void action2() {
    		try {
    			while (true) {
    				lock2.tryLock(50, TimeUnit.MILLISECONDS);
    				System.out.println("LOCK 2 ACQUIRED");
    				TimeUnit.MILLISECONDS.sleep(50);
    
    				if (lock1.tryLock()) {
    					System.out.println("LOCK 1 ACQUIRED");
    				} else {
    					System.out.println("CANNOT ACQUIRE LOCK 1, RELEASING LOCK 2");
    					lock2.unlock();
    					continue;
    				}
    
    				System.out.println("ACTION 2");
    				break;
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			lock1.unlock();
    			lock2.unlock();
    		}
    	}
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?