zoukankan      html  css  js  c++  java
  • 多线程下单例模式的实现_ThreadLocal_ReentrantLock

    package threadStudy;
    
    public class MultiThreadSingleInstance {
    
        // volatile  防止指令重排
        private static volatile MultiThreadSingleInstance instance;
    
        private MultiThreadSingleInstance() {
    
        }
    
        public static MultiThreadSingleInstance getInstance() {
            if (instance != null)
                return instance;
            else {
                //给字节码文件加锁
                synchronized (MultiThreadSingleInstance.class) {
                    instance = new MultiThreadSingleInstance();
                    return instance;
                }
                
            }
        }
        
        public static void main(String[] args) {
            new Thread(()->{
                System.out.println(MultiThreadSingleInstance.getInstance());
            }) .start();
            System.out.println(MultiThreadSingleInstance.getInstance());
        }
    }

    返回的地址一样  说明只创建了一个对象


     线程局部变量:https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ThreadLocal.html


    ReentrantLock的原理就是内部设置一个计数器,每次加锁的时候的如果计数器为0则成功加锁,如果不为0且持有锁的线程不是当前线程,则请求加锁的线程等待,否则,获得锁,且计数器值加一。

    package threadStudy;
    
    import java.util.concurrent.locks.ReentrantLock;
    
    public class ReentrantLockTest {
    
        private final ReentrantLock lock = new ReentrantLock();
        
        void a() {
            lock.lock();
            //返回当前线程持有的锁的数量
            System.out.println(lock.getHoldCount());
            b();
            System.out.println(lock.getHoldCount());
            lock.unlock();
            System.out.println(lock.getHoldCount());
        }
        
        void b() {
            lock.lock();
            //返回当前线程持有的锁的数量
            System.out.println(lock.getHoldCount());
            lock.unlock();
        }
        
        
        public static void main(String[] args) {
            new ReentrantLockTest().a();
        }
    
    }

  • 相关阅读:
    【译】高级指南-深入JSX
    记一次MongoDB裸奔
    CORS详解
    如何用Node编写命令行工具
    JSONP详解
    Web API接口之Geolocation
    认识AMD、CMD、UMD、CommonJS
    javascript之反柯里化(uncurrying)
    webpack3.0之loader配置及编写(一)
    小程序图形验证码前端实现
  • 原文地址:https://www.cnblogs.com/ustc-anmin/p/11014505.html
Copyright © 2011-2022 走看看