最近在学习多线程的时候遇到一个问题。
我用不同的线程类分别实例化了一个线程 thread1 和 thread2
thread1 和 thread2 分别在各自的 run 方法中 synchronize 了一个静态对象,然后在 thread1 中调用了 wait 方法,在 thread2 中调用了 notify 方法,发现会报错 java.lang.IllegalMonitorStateException
希望有大佬能够给小弟解答一二,非常感谢!
下面是代码:
public class MyThread extends Thread {
@Override
public void run() {
synchronized (Main.i) {
while (true) {
Main.i = Main.i + 1;
if (Main.i == 2) {
try {
Main.i.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public class MyThread2 extends Thread {
@Override
public void run() {
synchronized (Main.i) {
while (true) {
if (Main.i==2){
Main.i.notify();
}
}
}
}
}
public class Main {
public static volatile Integer i = 0;
public static void main(String[] args) {
MyThread myThread = new MyThread();
MyThread2 myThread2 = new MyThread2();
myThread.start();
myThread2.start();
}
}
1
wwqgtxx 2018-03-31 18:57:44 +08:00 1
你这里 Main.i = Main.i + 1;的时候 i 都已经不是同一个对象了好吧
|
3
lhx2008 2018-03-31 19:14:49 +08:00 via Android 1
@kerb15 你下面自己把 main.i 改了,相当于重新新建了一个 main.i,赋值,因为 Integer 是不变对象
|
4
iffi 2018-03-31 19:21:45 +08:00
看了下 Integer 是 final。它们不是同一个对象
|
5
ahmcscx 2018-03-31 19:22:28 +08:00
用 ReentrantLock
|
6
XinLake 2018-03-31 19:52:34 +08:00 via Android
我记得官方文档里讲 synchronized 锁对象应该用尽量简单的,像 Object。
|
7
Arsenal16 2018-03-31 20:58:07 +08:00 1
少年手边有《实战 Java 高并发程序设计》嘛?可以参见 2.8.4 错误的加锁这一节。
|
8
kerb15 OP 懂了,谢谢大家的热心指导!
|