java - Java:ReentrantLock 不起作用它仍然相互混合
问题描述
我无法弄清楚为什么代码不能正常工作。线程仍然相互混合。
我有 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
方法创建一个新ReentrantLock
实例。因此,每个线程锁定自己的锁,因此它们不会相互阻塞。一种方法是在ReentrantLockClass
' (隐式)构造函数中创建锁,然后在print
方法中将其锁定:
public class ReentrantLockClass {
// One lock shared for the instance
ReentrantLock lock = new ReentrantLock();
public void print(int count){
try {
lock.lock();
for(int i = 1 ; i <= 10 ; i ++){
System.out.println(count * i);
Thread.sleep(500);
}
}
catch (Exception e){}
finally {
lock.unlock();
}
}
}
推荐阅读
- django - 登录后如何使用 LoginRequiredMixin 让 Django 重定向到请求的页面?
- python - 今天开始使用Python,遇到了一个无法真正解决的问题
- go - Golang:在单个选择中使用多个代码案例阻止整个循环
- python - Python将动态值设置为字典
- c# - 如何获取通过 Azure 函数事件中心触发器接收到的事件的 messageId 或 eventId?
- oracle - ADF_FACES-60097
- javascript - 当我在 React.js 中使用 setState 函数时页面重新加载
- c# - 某些服务无法构建。验证服务描述符时出错
- javascript - react-native 应用程序和 RapidAPI - AI 图片着色器
- github-actions - 仅在文件存在时提交