- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 Java 线程并发中创建竞争条件并创建死锁。 我使用ReentrantLock,但它不会抛出InterruptedException。
现在是死锁,我使用lockInterruptically,但它不会抛出InterruptedException,有人可以告诉我为什么吗?
public class Test {
public static void main(String[] args) throws InterruptedException {
final Object o1 = new Object();
final Object o2 = new Object();
final ReentrantLock l1 = new ReentrantLock();
final ReentrantLock l2 = new ReentrantLock();
Thread t1 = new Thread() {
public void run() {
try {
l1.lockInterruptibly();
System.out.println("I am in t1 step 1 " + o1.toString());
Thread.sleep(1000);
l2.lock();
try {
System.out.println("I am in t1 step 2 " + o2.toString());
} finally {
l2.unlock();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Thread t2 = new Thread() {
public void run() {
try {
l2.lockInterruptibly();
System.out.println("I am in t2 step 1 " + o2.toString());
Thread.sleep(1000);
l1.lock();
try {
System.out.println("I am in t2 step 2 " + o1.toString());
} finally {
l1.unlock();
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
};
t1.start();
t2.start();
Thread.sleep(2000);
t1.interrupt();
t2.interrupt();
t1.join();
t2.join();
}
}
最佳答案
您的问题是每个线程尝试获取两个锁。
// Thread 1.
l1.lockInterruptibly();
// ....
l2.lock();
// Thread 2.
l2.lockInterruptibly();
// ....
l1.lock();
因此每个线程都会获取一个锁,然后尝试获取另一个线程已经持有的锁。这称为死锁。
您没有看到java.lang.InterruptedException
,因为线程正在等待的锁(第二个)不是可中断锁。
解决这个问题:
// Thread 1.
l1.lockInterruptibly();
// ....
l2.lockInterruptibly();
// Thread 2.
l2.lockInterruptibly();
// ....
l1.lockInterruptibly();
关于java - 为什么java ReentrantLock不抛出InterruptedException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37067730/
ReentrantLock 在创建 Lock 对象时提供 boolean fair 标志。 公平:真实 线程根据其等待的时间来访问临界区。 公平:假 没有为线程提供临界区的具体策略。 下面是我的代码:
我是 Java 新手。我只是在尝试线程,我想创建类似线程池的东西(如果这实际上是我正在做的事情......)。 基本上,我有一个 while 循环,它会触发线程,直到仍然有任务要执行&&,同时最大并发
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章详解java并发之重入锁-ReentrantLock由作者收集整理,如果
有谁知道方法acquire()和release()(java.util.concurrent.Semaphore)和await () 和 signal (new ReentrantLock().new
我一直在做一个关于 Java 多线程的学校作业。我遇到的一个任务是,我们需要在不同的组中创建多个线程,一旦每个组中有 4 个线程,只有这样才能释放它们协同工作,否则它们必须被搁置/等待。例如: 线程
我试图了解 Java 中 ReentrantLock 的内部工作原理。 我创建了一个示例,例如:- package com.thread.trylock; import java.util.concu
问题出在哪里? ReentrantLock 未显示预期结果。两个线程同时执行,而不是等待一个线程。 class MyThread2 extends Thread{ String name;
我正在为 Android 2.2 开发,对 ReentrantLocks 的工作原理有点困惑。以下代码是否会抛出 IllegalMonitorStateException?我问是因为我看不出它是如何做
我们的应用程序在 WebLogic 12c 中运行,正在从队列系统中检索消息,我们从中检索消息的队列配置为 FIFO。我们使用 Spring 来配置检索功能,并且容器 (org.springframe
我使用线程(等待和通知)功能创建了一个生产者消费者程序。代码是—— /** * Message.java ( Common object ) */ package threads; import
假设我有一个服务器有多个线程共享一个数据实例的引用。快速例如, edit1:为可读性更新 public void main() { Data data = new Data(); Reentran
我不明白为什么代码不能正常工作。问题是 ReentrantLock 没有锁定 ThreadClass.run() 中的方法调用 Resource-class哪些方法被假定为在ThreadClass中被
重入锁 void a() { lock.lock(); //got intrinsic lock System.out.println(Thread.currentThread(
我正在尝试在多线程上实现可重入锁,但由于某种原因,同一个线程解锁然后再次锁定导致始终运行相同的线程,因此运行相同的操作。 下面是线程产生的代码 IntStream.range(0,(NUMBER_OF
我有两个方法都由不同的线程运行,其中一个方法我不想在另一个方法被调用时运行。这就是我选择使用锁的原因 @Override public synchronized void doSomething(in
下面是线程被锁定之前和线程解锁之后的所有信息。我正在使用 ReentrantLock 的 lock() 和 unlock() 方法。然而,虽然某个进程已经解锁了该锁,但另一个进程却无法锁定同一个锁。
ReentrantLock 允许线程多次锁定某个资源, 这在执行/效率/功能方面有何好处? 请参阅此链接,https://www.geeksforgeeks.org/reentrant-lock-ja
当我在互联网上阅读一些并发代码示例时,我发现了这个(2个银行帐户之间的转账操作): class Account { double balance; int id; pub
我有一个 ReentrantLock,一堆操作正在锁定它,它是使用 new ReentrantLock(true) 公平创建的。有没有办法让线程“闯入”锁并在锁释放后但在任何其他线程之前获取它? 我考
我有一个带有静态变量的类,多个线程都会有这个类的实例。 我关心的静态变量是一个Thread,它将从队列中弹出一条消息并通过电子邮件发送,直到队列为空。每次将消息添加到队列时,我都会检查线程是否还活着。
我是一名优秀的程序员,十分优秀!