单例模式和多线程的实例:总结

最近在看 < 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

这边可以说明:

  1. 在系统运行时,单例即使在不同的线程中,也只会有一个对象
  2. 在多个线程中单例对象的数据可以共享.
  3. 在多线程并发时 ,单例对象的性能 ,以及加锁应该在考虑范围之类.

猜你喜欢

转载自blog.csdn.net/qq_14853889/article/details/79944250