java線程共享
如果該方法不涉及寫公共的資源比如一個靜態的變數或者寫文件,修改某個資料庫的值的時候沒有影響
比如你這個類里的方法只是對輸入的參數做一個計算然後返回計算的值就沒有影響。
但是如果是修改公共的資源比如修改資料庫中存儲的一個value則有可能出現問題,如:
public void writeDb(String key, String value) {
collectiondb();
write(key, value);
closeDbCollection();
}
因為Java的線程運行順序是不一定的,可以第一個線程運行完連接資料庫到後掛起了,這時候第二個線程開始運行,如果你的collectiondb()處理使用的是類中的一個實例變數Connection conn來保存資料庫的連接,當第二個線程運行完畢以後conn也被關閉了,第一個線程繼續執行write函數寫資料庫值的時候就會拋出異常。
這是一個例子,還有其他可能產生臟數據的問題
多線程如果使用公共資源的話最好在方法上聲明synchronized關鍵字讓其同步
『貳』 JAVA多線程的資源共享和死鎖問題。
Thread thread1 = new Thread(new Test(true));
對象裡面的flag 為 true;會獲得Lock.lock1
的鎖,
Thread thread2 = new Thread(new Test(false));
對象裡面的flag 為 false;會獲得Lock.lock2
的鎖,
然後thread1 又想獲得Lock.lock2,
代碼為:
synchronized (Lock.lock2) {
System.out.println("if-lock2");
}
然後thread2 又想獲得Lock.lock1,
代碼為:synchronized (Lock.lock1) {
System.out.println("else-lock1");
}
這樣就相互等待了,形成了死鎖
『叄』 java堆內存被所有線程所共享,不明白2個線程如何共享2個對象中的同名變數。
首先:堆內存共享是相對於棧內存的。棧是每一個線程都獨有的,線程之間互不一向,每一個線程都有自己的棧內存。但是堆內存不一樣,在一個JVM實例裡面,不管你有多少線程,創建了多少對象,都是放在一塊堆內存的。也就是說一個JVM實例棧內存區域是有多個,每一個線程持有一個,而堆內存只有一個,是線程共享的。
其次:針對你這個代碼,這個情況下每一個線程確實是對應著不同的對象。也就是在同一個堆(也只有一個堆)裡面創建了兩個Demo對象。你老師的意思應該是
Demo demo = new demo();
Thread S1=new Thread(demo);
Thread S2=new Thread(demo);
這樣兩個線程都是操作堆內存共享的對象。
『肆』 雲南電腦培訓分享Java線程的知識要點
一、進程的概念
進程表示資源分配的基本單位,又是調度運行的基本單位。例如,用戶運行自己的程序,系統就創建一個進程,並給它分配資源,包括內存空間、磁碟空間、I/O設備等。然後,把該進程放入就緒隊列。進程調度程序選中它,為它分配CPU以及其他有關的資源,該進程才真正運行。所以,雲南電腦培訓http://www.kmbdqn.com/發現進程是系統中的並發執行的單位。
二、線程的概念
線程:(英語:thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。
三、引用線程的優勢
(1)易於調度。
(2)提高並發性。通過線程可方便有效地實現並發性。進程可創建多個線程來執行同一程序的不同部分或相同部分。
(3)開銷少。創建線程比創建進程要快,所需開銷很少。
(4)利於充分發揮多處理器的功能。通過創建多線程進程(即一個進程可具有兩個或更多個線程),每個線程在一個處理器上運行,從而實現應用程序的並發性,使每個處理器都得到充分運行。
四、進程與線程的關系
(1)一個線程只能屬於一個進程,而一個進程可以有多個線程,但至少有一個線程。
(2)資源分配給進程,同一進程的所有線程共享該進程的所有資源。
(3)處理機分給線程,即真正在處理機上運行的是線程。
(4)線程在執行過程中,要協作同步。不同進程的線程間要利用消息通信的辦法實現同步。
簡單來說:
1、一個程序至少有一個進程,一個進程至少有一個線程。
2、進程在執行過程中擁有獨立的資源,而多個線程共享進程中的資源。
『伍』 java多線程共享變數
兩個線程同時獲取變數,
獲取之後.第一個線程++操作,然後進入睡眠.
這時,第二個線程,也獲取到了,做--操作.睡眠.
第一個線程醒來列印的是做過2次運算的數據(++,--)所以是0
第二線程也一樣.
這涉及到多線程安全問題.