【发布时间】:2020-11-20 13:31:09
【问题描述】:
我不明白为什么代码不能正常工作。线程仍然相互混合。
我有 A 类:
package com.company;
public class A implements Runnable {
ReentrantLockClass r;
public A(ReentrantLockClass r) {
this.r = r;
}
@Override
public void run() {
r.print(5);
}
}
和 B 类:
package com.company;
public class B implements Runnable{
ReentrantLockClass r;
public B(ReentrantLockClass r) {
this.r = r;
}
@Override
public void run() {
r.print(10);
}
}
这是用于运行 ReentrantLock 的 ReentrantLockClass
package com.company;
import java.util.concurrent.locks.ReentrantLock;
public class ReentrantLockClass {
public void print(int count){
ReentrantLock lock = new ReentrantLock();
try {
lock.lock();
for(int i = 1 ; i <= 10 ; i ++){
System.out.println(count * i);
Thread.sleep(500);
}
}
catch (Exception e){}
finally {
lock.unlock();
}
}
}
这是主类:
package com.company;
public class Main {
public static void main(String[] args) {
ReentrantLockClass r = new ReentrantLockClass();
A a = new A(r);
B b = new B(r);
Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
t2.start();
}
}
它应该运行一个线程然后运行其他线程
【问题讨论】:
-
print类中的ReentrantLockClass方法在每次调用时都会创建自己的ReentrantLock实例。所以A和B调用的时候,有两个独立的锁,当然不会互相等待。在ReentrantLockClass中创建一个ReentrantLock实例作为成员变量,而不是每次都在print方法中创建它。
标签: java multithreading oop locking reentrantlock