gpt4 book ai didi

Java:多线程安全问题:使用线程扩展和锁

转载 作者:行者123 更新时间:2023-12-03 12:58:17 25 4
gpt4 key购买 nike

当我使用Thread类和Lock来解决线程安全问题时,出现0票!
代码:

package ThreadTest;

import java.util.concurrent.locks.ReentrantLock;

class ThreadOne extends Thread{
private static int ticket = 100;
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while(true){
try {
lock.lock();
if(ticket > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"selling ticket: "+ticket);
ticket--;
}else{
break;
}
} finally {
lock.unlock();
}
}
}
}

public class ThreadMethod {
public static void main(String[] args) {
ThreadOne t1 = new ThreadOne();
ThreadOne t2 = new ThreadOne();

t1.setName("Window 1:");
t2.setName("Window 2:");

t1.start();
t2.start();
}
}
结果包含:
窗口2:售票:3
窗口1:售票:2
窗口2:售票:1
窗口1:售票:0
0票!

最佳答案

第一个问题是每个 ThreadOne 的每个实例都有两个独立的锁。 ,所以你实际上并没有锁定任何东西。甚至尝试获取线程之间的锁都没有竞争,因为它们都有自己的锁。如果你这样做,这很容易解决 ReentrantLock static .
如果你成功了 static但是,您会注意到只有一个“窗口”会继续获得门票。这与方式有关ReentrantLock在内部工作以及您使用的是 while(true){...} 的事实.这也很容易解决。任何一个:

  • 换锁公平:private static ReentrantLock LOCK = new ReentrantLock(true);
  • 或者在 finally 块之后睡一会儿,让另一个线程有机会运行。

  • 像这样:
    .....

    } finally {
    LOCK.unlock();
    }

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

    关于Java:多线程安全问题:使用线程扩展和锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65912154/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com