下面是我写的一段关于java的wait与notify测试代码,从逻辑上觉得控制台是不会有error字符输出的。
但是在eclipse上运行时发现运行一段时间会输出一次error。
没有想明白为什么,求大佬帮忙解释一下原理!!!import java.util.concurrent.atomic.AtomicBoolean;public class TestWait implements Runnable{
public final static byte[] lock = new byte[0];
public static AtomicBoolean flag = new AtomicBoolean(true);
public static void main(String[] args) {
new Thread(new TestWait()).start();
while(true){
synchronized (lock) {
flag.compareAndSet(false, true);
lock.notify();
}
}
} @Override
public void run() {
while(true){
try {
synchronized (lock) {
flag.compareAndSet(true, false);
lock.wait();
if(!flag.get()){
System.out.println("error");
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
但是在eclipse上运行时发现运行一段时间会输出一次error。
没有想明白为什么,求大佬帮忙解释一下原理!!!import java.util.concurrent.atomic.AtomicBoolean;public class TestWait implements Runnable{
public final static byte[] lock = new byte[0];
public static AtomicBoolean flag = new AtomicBoolean(true);
public static void main(String[] args) {
new Thread(new TestWait()).start();
while(true){
synchronized (lock) {
flag.compareAndSet(false, true);
lock.notify();
}
}
} @Override
public void run() {
while(true){
try {
synchronized (lock) {
flag.compareAndSet(true, false);
lock.wait();
if(!flag.get()){
System.out.println("error");
}
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
解决方案 »
- 使用Struts2,在Action中怎么才能得到页面提交的数据?
- hibernate中,要实现这种情况,映射文件应该怎么写?
- struts1.x action类之间的跳转问题
- 修改ibatis xml文件,重新tomcat?
- Log4j只能用于tomcat下的web应用程序中吗?
- SessionBean 与 hibernate 问题
- J2EE的安装问题(处女贴)!很急!!!!!
- ssh下使用jQuery中的异步刷新$.post()为什么回不到回调函数
- Struts 中文乱码问题 以及 URL暴露表单数据和SessionID问题,急~~~
- log4j初始化之前怎么打印日志
- @mapper换成@repository后无法注入
- springBoot集成JSP问题
当你 main线程 flag.compareAndSet(false, true);这条语句执行完之后而 notify还未执行之前
线程TestWait 在这之间执行了flag.compareAndSet(true, false); lock.wait(); 导致值被覆盖为false,之后线程进入休眠 然后马上main线程又执行了notify唤醒线程 导致 出现error锁与钥匙不在同一个同步代码块内就会导致这个问题虽然你给lock加了锁 但是并不是同一把锁 在调用同一个资源前 该线程都是可以进入对应的锁的