1. 程式人生 > >Java多執行緒之執行緒模式Immutable模式

Java多執行緒之執行緒模式Immutable模式

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類