Java 方法上的同步
这是一个示例程序 当前的行为是,Java 方法上的同步,java,Java,这是一个示例程序 当前的行为是,waitandsweep方法被waiting-waiting调用,然后执行一些工作。当A在等待时,B正在调用相同的方法,该方法等待某个时间并执行相同的工作 对于A和B,等待时间均为1000 我期望的行为是B在调用方法之前必须等待,而A等待等待时间并执行工作 也就是说,A的等待时间必须是1000,B的等待时间必须是1000+1 public class Wait { long waitTime =1000; Object lock = new Object(
waitandsweep
方法被waiting-waiting调用,然后执行一些工作。当A在等待时,B正在调用相同的方法,该方法等待某个时间并执行相同的工作
对于A和B,等待时间均为1000
我期望的行为是B在调用方法之前必须等待,而A等待等待时间并执行工作
也就是说,A的等待时间必须是1000,B的等待时间必须是1000+1
public class Wait {
long waitTime =1000;
Object lock = new Object();
boolean flag = true;
public static void main(String args[]){
final Wait wait = new Wait();
//Create two threads:
Thread thread1 = new Thread() {
public void run() {
wait.A();
}
};
Thread thread2 = new Thread() {
public void run() {
wait.B();
}
};
thread1.start();
thread2.start();
}
public synchronized void A(){
waitAndSweep("A");
}
public synchronized void B(){
waitAndSweep("B");
}
protected void waitAndSweep(String caller) {
try {
long waitTime = getWaitTime();
if (waitTime > 0)
wait(waitTime);
SomeWork();
System.out.println(caller + waitTime );
} catch (Exception e) {
}
}
private void SomeWork() {
this.waitTime = this.waitTime + 1;
}
public long getWaitTime() {
return waitTime;
}
public void setWaitTime(long waitTime) {
this.waitTime = waitTime;
}
}
电流输出:
1000
B1000
预期产出:
1000
B1001
我想我们需要做一些锁通知逻辑
由于我没有意识到这一点,有人能帮我吗?只需将waitAndSweep标记为已同步:
public synchronized void waitAndSweep(){…}
请参阅:创建同步的方法。在线程A释放对方法的锁定之前,您的线程B不会锁定(执行)该方法。您将此问题标记为,但我在此处看不到任何代码……请进一步澄清。您希望线程A等待1000毫秒执行,而不是线程B等待1001毫秒执行?很抱歉,没有添加代码。等待(..)方法在哪里?我想这是这个行为的关键。创建同步的方法。在线程A释放对方法的锁定之前,线程B不会锁定(执行)该方法。@mainshraprajapati同步waitandsweep方法不起作用。因为第一个A进入waitandsweep等待1000毫秒,同时B进入waitandsweep等待同样的1000毫秒。因为waitTime只有在A执行SomeWork()后才会更改