14.线程单例:线程单例和单例模式的区别???如何实现线程单例???

    技术2023-11-22  104

    14.线程单例:线程单例和单例模式的区别???如何实现线程单例???

    学习:第7遍


    1.线程单例和单例模式的区别???

    单例模式:在整个应用程序中只有一个实例

    线程单例:为每个线程提供一个实例 同一个线程获取的是一个实例 不同线程获取的是不同的实例


    2.如何实现线程单例???

    Java中提供了一个ThreadLocal,直接提供了线程单例的解决方案 用于管理变量,提供了线程局部变量 它为变量在每个线程中都存储了一个本地的副本 ThreadLocal:本质是Map集合,将线程当做key,保证线程唯一


    public class Test { //MyThreadLocal:自定义类 static MyThreadLocal<User> localDIY=new MyThreadLocal<User>(); //ThreadLocal:Java中直接提供的 static ThreadLocal<String> local=new ThreadLocal<String>(); public static void main(String[] args) { localDIY.set(new User()); System.out.println(localDIY.get()); local.set("aaa"); local.set("bbb"); local.set("ccc"); System.out.println(local.get()); System.out.println(local.get()); System.out.println(local.get()==local.get()); new Thread(new Runnable() { @Override public void run() { // local.set("aaa"); System.out.println(local.get()); } }).start(); } } class User { public User() { System.out.println("User.User()"); } } /* * 自己定义:线程单例 * 通过Map集合,将当前线程当做key */ class MyThreadLocal<T> { private Map<Thread, T> map = new HashMap<>(); public void set(T t) { map.put(Thread.currentThread(), t); // 将当前线程作为Key } public T get() { return map.get(Thread.currentThread()); } }
    Processed: 0.023, SQL: 9