【发布时间】:2014-03-27 18:45:50
【问题描述】:
错误代码
public class Scheduler {
private Object lock = new Object();
private int interval;
private int period;
public Scheduler(int interval , int period) {
this.interval = interval;
this.period = period;
}
public synchronized void setInterval(int interval) {
this.interval = interval;
}
public synchronized void setPeriod(int period) {
this.period = period;
}
public void updateScheduler(int interval , int period) {
synchronized(lock) {
setPeriod(period);
setInterval(interval);
}
}
}
我的代码中有一些线程安全问题来查找这些问题,我在我的项目中运行了线程安全的 Eclipse 插件。
线程安全报告
-
Scheduler 类中的混合同步
错误描述
为避免数据争用,重要的是并发访问的字段始终由公共锁保护。如果每次访问字段时都没有持有相同的锁对象,则可能发生数据竞争。
固定代码
public class Scheduler {
private Object lock = new Object();
private int interval;
private int period;
public Scheduler(int interval , int period) {
this.interval = interval;
this.period = period;
}
public void setInterval(int interval) {
synchronized(lock) {
this.interval = interval;
}
}
public void setPeriod(int period) {
synchronized(lock) {
this.period = period;
}
}
public void updateScheduler(int interval , int period) {
synchronized(lock) {
setPeriod(period);
setInterval(interval);
}
}
}
我测试了这段代码,它工作正常。我的问题是,我正在从 updateScheduler 内部调用 setPeriod 和 setInteval。当调用 updateScheduler 时,对象 lock 已经被锁定,然后我正在调用 setInterval 和 updateScheduler 但 >锁没有被释放。我期望代码最终会陷入死锁。但是,为什么没有发生呢?
【问题讨论】:
标签: java multithreading synchronization