多线程 使用lock锁 同步继承Thread类的线程出现异常
本帖最后由 minamikotori 于 2022-12-8 22:07 编辑class MyThread2 extends Thread{
private static int ticket = 100;
private ReentrantLock lock = new ReentrantLock();
@Override
public void run() {
while (true){
try {
lock.lock();
if (ticket > 0) {
System.out.println(currentThread().getName() + ":" + ticket);
ticket--;
} else
break;
} finally {
lock.unlock();
}
}
}
}
public class LockTest {
public static void main(String[] args) {
MyThread2 myThread1 = new MyThread2();
MyThread2 myThread2 = new MyThread2();
MyThread2 myThread3 = new MyThread2();
myThread1.start();
myThread2.start();
myThread3.start();
}
}
为什么会出现3个100呢,而99到1都是正常的,使用实现Runnable方法的时候就是正常的
楼主尝试把lock改成static后发现就变正常了 应该是没有使用同一个锁的问题导致的
但是为什么没有static时,只有100会出现异常 其余数字仅出现一次
本帖最后由 minamikotori 于 2022-12-8 22:07 编辑
楼主尝试把lock改成static后发现就变正常了 应该是没有使用同一个锁的问题导致的
但是为什么没有static时,只有100会出现异常 其余数字仅出现一次 学习下 {:10_254:} {:10_254:} {:10_266:} cy {:10_256:}{:10_256:}{:10_256:} 怎么可能用lock……用static试试? 学习下 {:10_257:}{:10_257:}{:10_257:}{:10_257:}{:10_257:} {:10_254:}{:10_254:}{:10_254:} 脸太黑了 {:10_247:}{:10_247:}{:10_247:}{:10_247:} {:10_279:}{:10_279:} minamikotori 发表于 2022-12-8 22:05
楼主尝试把lock改成static后发现就变正常了 应该是没有使用同一个锁的问题导致的
但是为什么没有static时 ...
有没有可能之后用的锁都是第三次100的那个 1335516694 发表于 2022-12-9 11:22
有没有可能之后用的锁都是第三次100的那个
那是为什么呢 能详细说明下嘛{:10_266:} minamikotori 发表于 2022-12-9 11:44
那是为什么呢 能详细说明下嘛
这个就是每个线程各用各的锁,也就是你这个上锁就不管用,在线程的run方法里面sleep一下就看出来了 1335516694 发表于 2022-12-9 13:43
这个就是每个线程各用各的锁,也就是你这个上锁就不管用,在线程的run方法里面sleep一下就看出来了
对 我知道是各用各的锁 那后面99到1 都只出现一次难道仅仅是巧合吗 minamikotori 发表于 2022-12-9 14:31
对 我知道是各用各的锁 那后面99到1 都只出现一次难道仅仅是巧合吗
巧合,中间打个sleep就能看见,每个都打印三次
页:
[1]