不使用synchronized和lock 锁实现线程安全单例
单例实现方式一,锁机制
- public class Singleton {
private static Singleton singleton=null;- public Singleton() {
}
public static Singleton getIntance(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}
单例实现方式二,静态内部类
- public class Singleton {
private static class SingletonHolder {
private static final Singleton singleton = new Singleton();- }
- public Singleton() {
}- public static Singleton getIntance() {
return SingletonHolder.singleton;
}
}
静态内部类虽然没有显示调用synchronized,但是借助ClassLoad的线程安全机制,隐式调用了synchronized
- 单例实现方式三,CAS操作
- public class Singleton {
private static final AtomicReference<Singleton> instance = new AtomicReference<>();- public Singleton() {
}- public static Singleton getIntance() {
for (; ; ) {
Singleton singleton = instance.get();
if (singleton == null) {
singleton = new Singleton();
instance.compareAndSet(null, singleton);
}
return singleton;
}
}- public static class SingletonHold implements Runnable {
- @Override
public void run() {
System.out.println(Thread.currentThread().getName() + ":" + Singleton.getIntance());
}- }
- public static void main(String[] args) {
SingletonHold singletonHold = new SingletonHold();
Thread thread1 = new Thread(singletonHold);
Thread thread2 = new Thread(singletonHold);
Thread thread3 = new Thread(singletonHold);
thread1.start();
thread2.start();
thread3.start();
}
}
运行结果:
Thread-0:com.rongke.web.Singleton@7249381e
Thread-1:com.rongke.web.Singleton@7249381e
Thread-2:com.rongke.web.Singleton@7249381e
使用cas好处:不需要使用锁来实现线程安全,而是依赖底层硬件实现,减少了因为锁导致线程切换和阻塞的性能开销,可以支持较大的并行度
使用cas缺点:如果线程一直处于for无限循环中,对cpu性能影响很大,如果多个线程执行singleton=new Singleton(),会产出堆内存浪费。
不使用synchronized和lock 锁实现线程安全单例的更多相关文章
- java多线程 synchronized 与lock锁 实现线程安全
如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的. 通过卖火车票的例子 火车站要卖票,我们模 ...
- Lock锁_线程_线程域
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- java双重检测或枚举类实现线程安全单例(懒汉模式)
双重检测实现 /** * 懒汉模式->双重同步锁单例模式 */ public class SingletonExample5 { private SingletonExample5() { } ...
- muduo网络库源码学习————线程本地单例类封装
muduo库中线程本地单例类封装代码是ThreadLocalSingleton.h 如下所示: //线程本地单例类封装 // Use of this source code is governed b ...
- Synchronized 和 Lock 锁在JVM中的实现原理以及代码解析
一.深入JVM锁机制:synchronized synrhronized关键字简洁.清晰.语义明确,因此即使有了Lock接口,使用的还是非常广泛.其应用层的语义是可以把任何一个非null对象作为&qu ...
- 第41天学习打卡(死锁 Lock synchronized与Lock的对比 线程协作 使用线程池)
死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有"两个以上对象的锁"时 ...
- synchronized 与 lock锁的异同
相同点: 二者都可以解决线程安全问题: 不同点: 1..Synchronized 是Java内置的关键字:Lock是一个Java类: 2.Synchronized 无法判断锁的状态:Lock可以判断是 ...
- 线程安全单例最佳实践,C#中的Lazy是如何保证线程安全的
在.NET 4.0之后,.NET Framework中提供了一种安全的延迟加载类型LazyLazy能够在多线程环境下,保证GetValue函数只执行一次,从而实现单例模式 在过去,实现单例模式我们通常 ...
- Java-多线程与单例
最近在公司写需求时遇到了多线程与单例一同出现的情况. 这个时候想到的就是线程安全以及单例的定义了,虽然单例指的是在内存中它只有一份,但是并不是说就是线程安全的. 所以,我当时就到网上找了关于多线程下单 ...
随机推荐
- 其他综合-内网下Yum仓库搭建配置
内网下Yum仓库搭建配置 1.实验环境 虚拟机环境: VMware 12 版本虚拟机 网络环境: 内网 IP 段:172.16.1.0 外网 iP 段(模拟):10.0.0.0 实验基础:(能够上网, ...
- [模板] 容斥原理: 二项式反演 / Stirling 反演 / min-max 容斥 / 子集反演 / 莫比乌斯反演
//待更qwq 反演原理 二项式反演 若 \[g_i=\sum_{j=1}^i {\binom ij} f_j\] , 则有 \[ f_i=\sum_{j=1}^i (-1)^{i-j} {i \ch ...
- docker-lnmp dockerfile
code: FROM php:7.1.26-fpm WORKDIR /usr/share/nginx/html # bcmath pdo_mysql intl gd zip opcache xdebu ...
- HF-01
胡凡 本书在第2章对C语言的语法进行了详细的入门讲解,并在其中融入了部分C+的特性. 第3-5章是 入门部分. 第3章 初步训练读者最基本的编写代码能力: 第4章对 常用介绍,内容重要: 第5章是 ...
- Istio
什么是Istio Istio是Service Mesh(服务网格)的主流实现方案.该方案降低了与微服务架构相关的复杂性,并提供了负载均衡.服务发现.流量管理.断路器.监控.故障注入和智能路由等功能特性 ...
- 001 Unity学习大纲
- PHP代码审计之XSS操作
XSS XSS是Cross Site Scripting(跨站脚本攻击), 它与sql注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除的目的,而在XSS攻击中,通过插入 ...
- Lambda表达式概念与基本语法
Lambda表达式是Java 8的重要更新,一个被广大开发者期待已久的新特性.Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接口被 ...
- 全局API
Vue.extend( options ): extend创建的是一个组件构造器,而不是一个具体的组件实例 //选项对象 baseOptions let baseOptions= { template ...
- “短路求值(Short-Circuit Evaluation)
// 逻辑与和逻辑或操作符总是先计算其做操作数,只有在仅靠左操作数的值无法确定该逻辑表达式的结果时,才会求解其右操作数. function aa() { if (null) { console ...