Java多執行緒之執行緒模式Immutable模式
阿新 • • 發佈:2018-12-19
Immutable模式
概念:保障資料的安全性,不可變的一種模式。
舉例:java.lang.string 實現了Immutable模式。無需為類中的方法宣告為synchronized,無論被多少個執行緒訪問String物件,物件不可變,不需要考慮執行緒的互斥處理。
確保例項狀態不會被改變的類(Immutable類)。
入門例項
person類:Immutable 類
package immutableTest; /* * 例項建立後,該物件的屬性不可改變。 * 屬性是私有的,提供getter方法,不給出setter方法。 * 多個執行緒訪問Person,無需要宣告為同步方法 * * 優化:類宣告為final,表示無法建立子類,欄位也為final * * person就是一個Immutable類 * */ public final class Person { private final String name ; private final String address; public String getName() { return name; } public String getAddress() { return address; } public Person(String name, String address) { super(); this.name = name; this.address = address; } @Override public String toString() { return "Person [name=" + name + ", address=" + address + "]"; } }
PrintPersonThread:顯示Person例項的執行緒類
package immutableTest; public class printPersonThread extends Thread{ private Person person; public printPersonThread(Person person) { super(); this.person = person; } public void run() { while(true) { System.out.println(Thread.currentThread().getName()+"print:"+person); } } }
TestMain類:測試類
package immutableTest;
public class Test {
public static void main(String[] args) {
Person p1 = new Person("小李", "中國"); //建立一個person物件
new printPersonThread(p1).start();//多個執行緒同時使用p1物件,物件資料不變
new printPersonThread(p1).start();
new printPersonThread(p1).start();
}
}
集合類中執行緒安全
package ListTest; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; public class ListTest { public static void main(String[] args) { //List<Integer> list = new ArrayList<Integer>(); List<Integer> list = new CopyOnWriteArrayList<>();//寫時複製 new WriterThread(list).start(); new ReaderThread(list).start(); } } class WriterThread extends Thread{ private final List<Integer> list; public WriterThread(List<Integer> list) { super(); this.list = list; } public void run() { for(int i=0;true;i++) { list.add(i); list.remove(0); } } } class ReaderThread extends Thread{ private final List<Integer> list; public ReaderThread(List<Integer> list) { super(); this.list = list; } public void run() { for(int n:list) { System.out.println(n); } } }
成對出現的Mutable類和Immutable類
StringBuffer 是字串Mutable類
String是字串的Immutable類
Java類中Immutable類
包裝類
bigInteger類
Pattren類