一、使用runnable來實現多執行緒
package com.xiancheng.old;
/** */
public class threadold implements runnable catch (interruptedexception e)
falg = true;
}public boolean isfalg()
public void setfalg(boolean falg)
}
二、測試
在沒有使用synchronized或輕量組鎖volatile的**如下
/**
* 需求:當flag為真的時候結束程式。
* * @author: sgx
* @datetime:2023年4月26日 上午9:53:21
*/ @test
public void test() }}
執行這個**的時候就出現了問題,程式遲遲不會結束。
造成這個問題的原因是什麼呢。先看主線程和子執行緒記憶體模型
子執行緒已經把falg改為true了,為什麼主線程讀取不到呢,因為我們的子執行緒在改動falg的值後沒有告訴主線程,主線程拿不到已經已經修改後的falg的值。所以解決方法如下。
1. 用同步**塊
public class threadold implements runnable catch (interruptedexception e)
falg = true;
}public boolean isfalg()
public void setfalg(boolean falg)
}
@test
public void test() }}
}
2. 用volatile關鍵字
public class threadold implements runnable catch (interruptedexception e)
falg = true;
}public boolean isfalg()
public void setfalg(boolean falg)
}
@test
public void test() }}
三、記憶體可見性問題的解決
1. 記憶體可見性(memory visibility)當乙個執行緒修改了變數的值,新的值會立刻同步到主記憶體當中。而其他執行緒讀取這個變數的時候,也會從主記憶體中拉取最新的變數值。
2. 可見性錯誤是指當讀操作與寫操作在不同的執行緒中執行時,我們無法確保執行讀操作的執行緒能適時地看到其他執行緒寫入的值,有時甚至是根本不可能的事情。
3. 我們可以通過同步來保證物件被安全地發布。除此之外我們也可以使用一種更加輕量級的volatile 變數。
4.為什麼volatile關鍵字可以有這樣的特性?
四、為什麼要使用volatile
比原來的synchroized輕量,效率高,對於多執行緒不是一各互斥關係,保證程式指令不重排序
五、volatile的業務使用
1.執行結果並不依賴變數的當前值,或者能夠確保只有單一的執行緒修改變數的值。
2.但是不能變數的原子性操作。變數不需要與其他的狀態變數共同參與不變約束(狀態)。如下**
public class volatileatomicity
system.exit(0);
}}, "執行緒一").start();
new thread(new runnable()
}}, "執行緒二").start();}}
while(start < end)會在某個瞬間造成start==end,從而結束程式。 Java中建立多執行緒
建立乙個runnable物件runable threadjob new myrunnable runnable相當於執行緒中所要執行的工作。我們需要新建乙個類繼承runnable介面,並重寫它唯一的方法run run 方法被放在新執行緒的棧底,是被第乙個執行的方法。2.建立乙個thread類的物件,...
java中的多執行緒
package testthread 店員從生產者取貨,消費者從店員取貨,店員最多只能存放20個產品,當產品不夠20個需通知生產者生產,超過20個時停止消費 author passenger 店員類 class clerk catch interruptedexception e else 消費產品...
java中的多執行緒
建立執行緒的第一種方法 繼承thread類。步驟 1,定義乙個類繼承thread 2,複寫thread類中的run方法 目的 將自定義 儲存在run方法中,讓執行緒執行 3,呼叫執行緒的start方法,該方法用兩個作用 啟動執行緒,呼叫run方法 多執行緒的特性 隨機性 示例 class demo ...