Java 线程活锁怀疑

Java 线程活锁怀疑,java,multithreading,Java,Multithreading,现场 有一个livelock的概念,首先是说这里的线程没有被阻塞,然后是说线程被阻塞。。。“他们还在互相阻拦” 所以我不太明白。。。如果他们被封锁了,看起来就像是死锁 如果能够模拟Java网站上报道的Alphonse和Gaston示例,有谁能给我一个简单的Java活锁代码更好吗?有死锁时,有两个或更多线程:每个线程持有一个锁,需要获得另一个锁。每个线程都睡在另一个线程持有的锁上。因为他们睡着了,所以他们“死了”——不执行任何代码,而且永远不会执行 使用livelock时,两个或多个线程处于活动状

现场 有一个livelock的概念,首先是说这里的线程没有被阻塞,然后是说线程被阻塞。。。“他们还在互相阻拦” 所以我不太明白。。。如果他们被封锁了,看起来就像是死锁


如果能够模拟Java网站上报道的Alphonse和Gaston示例,有谁能给我一个简单的Java活锁代码更好吗?

有死锁时,有两个或更多线程:每个线程持有一个锁,需要获得另一个锁。每个线程都睡在另一个线程持有的锁上。因为他们睡着了,所以他们“死了”——不执行任何代码,而且永远不会执行

使用livelock时,两个或多个线程处于活动状态并正在执行代码,但它们无法继续其代码中的过去条件,因为它们太忙于响应livelock中其他线程的事件

我的Java在这一点上已经严重生锈,所以让我们用一个简单的描述:

两个线程,
A
B
,需要获取锁
1
2
,以便执行某些操作(吃三明治):

如果这两个线程总是交替使用指令,那么两个线程都不会吃东西 三明治:他们都将花费所有的时间来获取、测试和测试
放下锁,但他们永远无法前进。

很有趣。我看到了“livelock”的一个完全不同的定义,它涉及两个线程通过管道交换数据,而发送方忘记刷新数据,因此读者无限期地等待数据。
Thread A tries this:

Acquire lock 1
if try_lock(2) == success
  eat the sandwich
else
  drop 1
  sleep a bit
  go back to start


Thread B tries this:

Acquire lock 2
if try_lock(1) == success
  eat the sandwich
else
  drop 2
  sleep a bit
  go back to start