最近在看 < effective java > 一边看,一遍找源码敲案例,确实有点头疼; 第一章节讲的是对象的创建和销毁 ; 讲了很多关于单例的 内容 . 于是就在想单例和线程的关系. 敲了一段demo .我们通过代码的结果来总结:
single domain 类
public class SingleTest {
private String name ;
private final static SingleTest INSTANCE = new SingleTest();
private SingleTest (){}
private SingleTest(String name){
this.name = name;
}
public static SingleTest getInstantce(){
return INSTANCE;
}
// 以下get set
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/* @Override
public String toString() {
return "SingleTest{" +
"name='" + name + '\'' +
'}';
}*/
}
线程A:
public class ThreadA implements Runnable{
@Override
public void run() {
SingleTest instantce = SingleTest.getInstantce();
System.out.println("Thread_A_Instance : "+instantce);
instantce.setName("12");
System.out.println("Threand_A_SetName = "+"12");
}
}
线程B
public class ThreadB implements Runnable {
@Override
public void run() {
SingleTest instantce = SingleTest.getInstantce();
System.out.println("Thread_B_Instance : "+instantce);
System.out.println("Thread_B_GetName = "+instantce.getName());
}
}
单元测试
@Test
public void testInstance(){
Thread thread = new Thread(new ThreadA());
Thread thread1 = new Thread(new ThreadB());
thread.start();
thread1.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
while (true){
}
}
输出:
Thread_A_Instance : com.ding.domain.SingleTest@35060f17
Thread_B_Instance : com.ding.domain.SingleTest@35060f17
Threand_A_SetName = 12
Thread_B_GetName = 12
这边可以说明:
- 在系统运行时,单例即使在不同的线程中,也只会有一个对象
- 在多个线程中单例对象的数据可以共享.
- 在多线程并发时 ,单例对象的性能 ,以及加锁应该在考虑范围之类.