2 回答

TA貢獻(xiàn)1895條經(jīng)驗 獲得超7個贊
你的問題是可怕的線程鎖!
但是如果我嘗試將 synchronized 關(guān)鍵字添加到 increment() 方法,我不會得到我想要的結(jié)果。
當(dāng)然 !線程管理器隨時更改“工作”線程!,您應(yīng)該在此處發(fā)布更多代碼,但乍一看,您在兩個線程中運行相同的方法,因此它將下降到 2 種情況:-
好案例!線程管理器在完成調(diào)用增量方法后更改線程(兩個線程的好老雙贏^-^)。
糟糕的情況(這就是您所面臨的)想象一個線程訪問了該方法,并且在完成該方法之前,線程管理器更改了它,并且當(dāng)另一個方法嘗試訪問它時,發(fā)現(xiàn)
synchronized
它面臨著鎖其他線程!從這里他們不能保證會發(fā)生什么,但我可以向你保證,這種情況下 90% 的結(jié)果只會讓線程管理器滿意。
應(yīng)用程序應(yīng)該能夠“啟動”和“停止”任一線程(兩個線程同時遞增值)并將任一線程置于臨界區(qū)(僅允許一個線程遞增值)。
很抱歉打擾您,但線程管理器是無法控制的,我的朋友。但是我們可以向線程管理器建議相當(dāng)多的事情,所以你想要實現(xiàn)的目標(biāo)在 java 線程管理器中是不可能的。
并停止線程的 ooky dooky ,但是在停止線程后啟動線程是大不!
從Thread.start()
文檔
多次啟動一個線程是不合法的。特別是,線程一旦完成執(zhí)行就可能不會重新啟動。
如果線程已經(jīng)啟動,則拋出 IllegalThreadStateException。
這是一個非常豐富的鏈接,您可以在 oracle 上更廣泛地解釋該主題

TA貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
synchronized您可以使用關(guān)鍵字來使用對象級鎖。
=>對象級鎖: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;
}
}
}
添加回答
舉報