多线程下单例模式的实现_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();
    }

}

 

转载于:https://www.cnblogs.com/ustc-anmin/p/11014505.html

### Java 面试常见问题及场景应对 #### 多线程与并发控制 在处理高并发请求时,确保数据的一致性和安全性至关重要。针对商品库存管理中的线程安全问题,在单点系统中可以通过`java.util.concurrent.locks.Lock`接口下的具体实现类如ReentrantLock来保障资源访问的安全性;而在分布式环境中,则需借助Redisson等工具提供的分布式锁机制[^2]。 #### 秒杀系统的优化策略 秒杀活动往往伴随着大量瞬时流量涌入服务器端口,这不仅考验着后台服务承载能力同时也给数据库带来了巨大压力。为了缓解此类情况带来的负面影响: - **缓存层面**:利用本地或分布式缓存(如Ehcache/Redis),提前预热热门商品详情页面及其关联信息,并设置合理的过期时间防止缓存雪崩现象发生; - **限流措施**:引入令牌桶或者漏斗算法限制每秒钟允许进入业务逻辑层的最大请求数量,从而保护下游微服务体系免受冲击影响正常运转状态; - **库存扣减方式调整**:由传统的先下单再减库改为乐观锁版本号校验模式下尝试更新指定数量的商品剩余数目字段值,有效减少因网络延迟等因素造成的重复提交风险进而杜绝超卖状况的发生。 #### 订单流程设计考量 考虑到实际应用场景复杂多样,对于涉及资金交易环节的操作应当格外谨慎对待。当用户发起购买指令后直至完成付款之前这段时间里可能会遇到各种意外情形(比如突然断网)。因此有必要制定一套完善的异常处理预案——一旦检测到长时间未收到确认反馈则自动触发取消该笔订单并释放已锁定的产品份额供其他顾客选购。 ```java // 使用ThreadLocal存储当前线程独占的对象实 private static final ThreadLocal<Session> threadLocalSession = new ThreadLocal<>(); public void setSession(Session session){ threadLocalSession.set(session); } public Session getSession(){ return threadLocalSession.get(); } ``` 上述代码展示了如何运用`ThreadLocal`特性为每个HTTP请求分配独立的持久化会话对象,既简化了参数传递过程又提高了程序执行效率[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值