java多執行緒問題 多核cpu遇上java多執行緒,求解釋
java多執行緒問題 多核cpu遇上java多執行緒,求解釋,程式碼如下:
主機win7 i5雙核4執行緒cpu,虛擬機器xp單核,下面程式碼主機和虛擬機器跑得結果差太遠了,
主機執行結果和預期不一樣,虛擬機器卻和預計一樣
class ThreadDemo1
{
public static void main(String [] args)
{
TestThread tt = new TestThread();
new Thread(tt).start();
try
{
Thread.sleep(1);
}
catch(Exception e)
{
e.printStackTrace();
}
tt.str = new String("method");
new Thread(tt).start();
}
}
class TestThread implements Runnable//*/extends Thread//兩種執行緒方式 繼承和實現介面
{//runnable適合多個執行緒處理同一個資源
int tickets = 100;
String str = new String("");
public void run()
{
if(str.equals("method"))
{
while(true)
{
sale();
}
}
else
{
while(true)
{
synchronized(this)//用str時不能同步
{
if(tickets > 0)
{
try
{
Thread.sleep(10);//暫停10毫秒
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.println( Thread.currentThread().getName() + " is saling tacket "+ tickets--);
}
}
}
}
}
public synchronized void sale()//同步函式
{
if(tickets > 0)
{
try
{
Thread.sleep(10);//暫停10毫秒
}
catch(Exception e)
{
e.printStackTrace();
}
System.out.print("sale(): ");
System.out.println( Thread.currentThread().getName() + " is saling tacket "+ tickets--);
}
}
}
主機執行結果,sale方法根本就沒有被執行!
虛擬機器執行結果:達到預期的同步程式碼塊和同步函式的同步結果
求解釋!就高手解釋!
此程式碼源於張孝祥的java視訊,在我機子上執行結果和他視訊上的執行結果不一樣,卻和虛擬機器的貌似一樣。。
網上看到如下某些解釋:
關鍵問題在於,你無法預測每個cpu的時間片分配。所以,要得到你想要的輸出結果就屬於隨機事件了。 對與多核cpu 上的程式同步問題,最好不要用訊號量,互斥量,事件物件,因為它們都屬於核心物件,都是對一個cpu而言的。其他的cpu根本不會理睬你設定的這些東西。
是不是裡面的監視器this的問題呀。。。
經過實驗,用上面的程式碼進行分別用this 和str作為監視器實現死鎖時,主機不出現思索,虛擬機器卻出現死鎖,看來真的跟多核和this有關
來個高手解釋下
。。。。。
。。。。。
。。。。。
。。。。。
相關文章
- java多執行緒執行問題Java執行緒
- Java多執行緒面試高配問題---多執行緒(3)🧵Java執行緒面試
- Java多執行緒——執行緒Java執行緒
- Java多執行緒-執行緒中止Java執行緒
- Java多執行緒——執行緒池Java執行緒
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- 【Java多執行緒】輕鬆搞定Java多執行緒(二)Java執行緒
- 05.java多執行緒問題Java執行緒
- java——多執行緒Java執行緒
- java 多執行緒Java執行緒
- 【Java】多執行緒Java執行緒
- JAVA 多執行緒 ??Java執行緒
- java多執行緒Java執行緒
- Java - 多執行緒Java執行緒
- java多執行緒面試題Java執行緒面試題
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- Java多執行緒之執行緒中止Java執行緒
- 【java多執行緒】(二)執行緒停止Java執行緒
- Java多執行緒——守護執行緒Java執行緒
- Java多執行緒16:執行緒組Java執行緒
- Java多執行緒18:執行緒池Java執行緒
- 【java 多執行緒】多執行緒併發同步問題及解決方法Java執行緒
- Java多執行緒學習(一)Java多執行緒入門Java執行緒
- Java多執行緒(一)多執行緒入門篇Java執行緒
- 多執行緒問題解釋執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 【Java多執行緒】執行緒安全的集合Java執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒系列之執行緒池Java執行緒
- Java 多執行緒面試問題彙總Java執行緒面試
- 小小問題―關於java多執行緒Java執行緒
- java 多執行緒 –同步Java執行緒
- java多執行緒原理Java執行緒
- java 多執行緒-3Java執行緒