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类