- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想知道是否有人可以帮助我。我是并发编程的新手,我有以下代码,有时会给我一个 IllegalMonitorStateException 作为当前不拥有锁的线程正在尝试解锁。
我在 OTN 论坛上被告知,为了防止这种情况和死锁发生,我应该确保首先锁定最低的索引,但我不知道如何做到这一点。你们中的谁能指出我正确的方向吗?
非常感谢。
import java.util.concurrent.locks.*;
class ShuffleBase {
ReentrantLock [] locker;
int [] data;
int x;
ReentrantLock lock1;
ReentrantLock lock2;
public ShuffleBase(int [] d){
x=0;
data=d;
locker = new ReentrantLock[d.length];
while (x!=data.length)
{
locker[x]=new ReentrantLock();
x++;
}
}
/*
* Boolean method to test if both indexes are locked
* Returning their status for use in the method swap
* If locked the swap happens else the locks are
* released
*/
public boolean lockedIndex(int a, int b){
Boolean lockA = false;
Boolean lockB = false;
try{
lockA = lock1.tryLock();
lockB = lock2.tryLock();
}finally{
if (!(lockA && lockB))
{
if(lockA){
lock1.unlock();
}
if (lockB){
lock2.unlock();
}
}// end of IF ! lockA & lockB
} // End of finally
return lockA && lockB;
}// End of lockedIndex
public void swap(int a, int b){
int temp;
lock1 = locker[a];
lock2=locker[b];
//If a & b aren't the same index swap
if(a!=b)
{
if(lockedIndex(a,b))
{
try{
temp=data[b];
data[b]=data[a];
data[a]=temp;
}finally{
lock1.unlock();
lock2.unlock();
}
}
else{System.out.println("Couldn't lock");}
}
else{return;}
}//EOF Method
public void display(){
System.out.println("The array when swapped");
for(int j=0; j<data.length;j++)
{
System.out.print(data[j]+", ");
}
}// End of Display
}// EOC
<小时/>
谢谢大家的回答,是的,我这样做是作为自学/作业的一部分。我已将代码更改为以下内容,因为我相信这就是 Rodion 的建议,我希望我正确解释了您的建议。 Mtraut 我也做了你建议的更改,我不敢相信我犯了这些错误:-) 感谢您发现它们。
import java.util.concurrent.locks.*;
class ShuffleBase {
ReentrantLock [] locker;
int [] data;
int x=0;
public ShuffleBase(int [] d){
data=d;
locker = new ReentrantLock[d.length];
while (x!=data.length)
{
locker[x]=new ReentrantLock();
x++;
}
}
/*
* Boolean method to test if both indexes are locked
* Returning their status for use in the method swap
* If locked the swap happens else the locks are
* released
*/
private boolean lockedIndex(int a, int b){
Boolean lockA = false;
Boolean lockB = false;
try{
lockA = locker[a].tryLock();
lockB = locker[b].tryLock();
}finally{
if (!(lockA && lockB))
{
if(lockA){
locker[a].unlock();
}
if (lockB){
locker[b].unlock();
}
}// end of IF ! lockA & lockB
} // End of finally
return lockA && lockB;
}// End of lockedIndex
public void swap(int a, int b){
int temp;
//If a & b aren't the same index swap
if(a!=b)
{
if(lockedIndex(a,b))
{
try{
temp=data[b];
data[b]=data[a];
data[a]=temp;
}finally{
locker[a].unlock();
locker[b].unlock();
}
}
else{System.out.println("Couldn't lock");}
}
else{System.out.println(return;}
}//EOF Method
public void display(){
System.out.println("The array when swapped");
for(int j=0; j<data.length;j++)
{
System.out.print(data[j]+", ");
}
}// End of Display
}// EOC
再次感谢您的所有回答,并对我迟到的回复表示歉意。
最佳答案
以下是针对您的程序的快速修复:
lock1
和lock2
领域,它们是你的源泉问题。 lock1
与 locker[a]
和 lock2
与 locker[b]
.您的程序没有任何死锁问题,因为您正在使用 tryLock()
所以你真的不需要担心这个。如果您使用lock()
那么你需要考虑获取锁的顺序,否则可能会死锁(请参阅其他答案)。
现在你当前的程序有缺陷的原因是 lock1
和lock2
字段在线程之间共享。例如,线程 1 设置 lock1
至locker[0]
,然后立即另一个 thread-2 覆盖 lock1
将其设置为 locker[99]
,所以当 thread-1 尝试解锁 lock1
时它恰好引用了 locker[99]
线程 2 获取的锁,因此 IllegalStateMonitorException
.
希望这能解决问题。
关于tryLock 上的 Java IllegalMonitorStateException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4554071/
我是 Java 新手(也是 RoR 开发人员)。 我有一个简单的程序。球由球员共享。球应传给随机玩家。 好的,代码如下: class Ball { private int currentPl
我是否没有正确使用同步: 在下面的代码中我遇到了两个问题: 1.在将方法(designBusiness、createBusiness、sellBusiness)设置为 synchronized 时,就
我不完全理解wait和notify(Object)是如何工作的,结果我被迫瘦身将我的尝试记入以下代码部分。 Main.java: import java.util.ArrayList; class M
我有这个代码 if( id == 0 ||(id % 2) != 0){ System.out.println("test"); synchronized(lo
我是 Java 新手。我刚刚读了《java核心》这本书。我遇到了有关“条件和锁定”的问题。 我从书上敲了一段代码到eclipse中做了一些练习。 当我运行代码时,“sufficientFund.wai
我想模拟一个妈妈叫三个 child 吃饭,这是我的代码: class child extends Thread{ String name; mother mom; public
我正在尝试在新线程中调用方法,该方法将在使用 callable 延迟后返回一些东西。由于,它正在下降IllegalMonitorStateException 当我只创建类的实例,调用方法并且该方法将延
我已经使用 java 线程构建了生产者-消费者。生产者和消费者是两个不同的类,指的是单链表和对象锁。下面的实现有什么问题? Item Produced by Thread-0 Item 1 Item
我在我的代码中遇到了 IllegalMonitorStateException,我不确定为什么会收到它以及如何修复它。我当前的代码是并且错误发生在 try block 中: public stat
请向我解释为什么我的代码在等待函数中抛出 IllegalMonitorStateException ,据我所知,只有在同步部分未完成时才会发生这种情况? private void deliver(in
每当我调用pauseThread()时,它总是抛出IllegalMonitorStateException。 我在文档中注意到我需要拥有对象监视器才能使线程等待。 用这段代码 synchronized
我正在尝试学习java并发编程。请检查我的示例代码并帮助我理解为什么我会收到“java.lang.IllegalMonitorStateException”,即使我在同步上下文中调用了 wait()
我对监视器和条件变量不熟悉。我在监视器中使用锁定和条件变量。 public class Monitor { private final int piNumberOfPhilosopher
所以我正在尝试编写一个程序来打印出以下输出: 44 33 22 11 该程序应该是多线程的,并且必须使用锁来防止竞争条件。它还必须利用 Condition,以便当线程想要打印的数字与变量 thread
我对多线程了解甚少。 我期望下面的程序能够完美运行,但它不起作用并产生以下异常。 Exception in thread "Thread-1" java.lang.IllegalMonitorStat
我不完全理解wait和notify(Object的)的工作方式,因此,我不得不将尝试减少到以下代码部分。 Main.java: import java.util.ArrayList; class
void waitForSignal(){ Object ob =new Object(); synchronized (Thred.currentThread()) {
我收到一个 IllegalMonitorStateException,我觉得我无法阅读更多内容,所以我问是否有人知道我做错了什么。在计数器(门类中线程之间的共享资源)陷入等待状态后,我在程序运行结束时
我有一个程序可以模拟一艘船的大门。它们在线程中运行。这个想法是让它们在 run 方法中的随机时刻运行和暂停,以模拟路过的人。这是由所有线程完成的,同时主线程正在等待通知并检查船是否已满,当线程通知他们
我想在线程中运行的 Vector 中使用同步 我尝试使用两种方法,一种用于等待,另一种用于通知 我想从静态类调用notify方法这是我的线程代码: import java.io.IOException
我是一名优秀的程序员,十分优秀!