2 回答
TA贡献1895条经验 获得超7个赞
你的问题是可怕的线程锁!
但是如果我尝试将 synchronized 关键字添加到 increment() 方法,我不会得到我想要的结果。
当然 !线程管理器随时更改“工作”线程!,您应该在此处发布更多代码,但乍一看,您在两个线程中运行相同的方法,因此它将下降到 2 种情况:-
好案例!线程管理器在完成调用增量方法后更改线程(两个线程的好老双赢^-^)。
糟糕的情况(这就是您所面临的)想象一个线程访问了该方法,并且在完成该方法之前,线程管理器更改了它,并且当另一个方法尝试访问它时,发现
synchronized它面临着锁其他线程!从这里他们不能保证会发生什么,但我可以向你保证,这种情况下 90% 的结果只会让线程管理器满意。
应用程序应该能够“启动”和“停止”任一线程(两个线程同时递增值)并将任一线程置于临界区(仅允许一个线程递增值)。
很抱歉打扰您,但线程管理器是无法控制的,我的朋友。但是我们可以向线程管理器建议相当多的事情,所以你想要实现的目标在 java 线程管理器中是不可能的。
并停止线程的 ooky dooky ,但是在停止线程后启动线程是大不!
从Thread.start()文档
多次启动一个线程是不合法的。特别是,线程一旦完成执行就可能不会重新启动。
如果线程已经启动,则抛出 IllegalThreadStateException。
这是一个非常丰富的链接,您可以在 oracle 上更广泛地解释该主题
TA贡献1796条经验 获得超4个赞
synchronized您可以使用关键字来使用对象级锁。
=>对象级锁:To synchronize a non static method or block so that it can be accessed by only one thread at a time for that instance. It is used to protect non static data.
例子 :
public class ClasswithCriticalSections {
private AtomicInteger count = new AtomicInteger(0);
public synchronized int increment() {
count.incrementAndGet();
return count;
}
}
或者
public class ClasswithCriticalSections {
Object lock1 = new Object();
Object lock2 = new Object();
private AtomicInteger count = new AtomicInteger(0);
public int increment() {
synchronized(lock1) {
count.incrementAndGet();
return count;
}
}
public int decrement() {
synchronized(lock2) {
count.addAndGet(-1);
return count;
}
}
}
添加回答
举报
