不使用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-多线程与单例
最近在公司写需求时遇到了多线程与单例一同出现的情况. 这个时候想到的就是线程安全以及单例的定义了,虽然单例指的是在内存中它只有一份,但是并不是说就是线程安全的. 所以,我当时就到网上找了关于多线程下单 ...
随机推荐
- 图解从 URL 到网页通信原理
前言 一.文本对话--从请求到响应 二.TCP/IP 协议族介绍 三.基于TCP/IP通信过程 四.TCP建立连接及断开(重点补充) 小结 前言 互联网的原始目的,就是为了传输文本(文本对话).那我们 ...
- VScode插件以及配置
Auto Rename Tag —— 自动同步修改标签 AutoFileName —— 自动补全路径提示 background —— 一个萌萌的插件,可以自己设置vsc的背景图 Bootstrap 3 ...
- C#中字符串转日期类型
1,yyyyMMdd DateTime date = DateTime.ParseExact(", "yyyyMMdd", System.Globalization.Cu ...
- luogu3687-[ZJOI2017] 仙人掌
Description P3687 [ZJOI2017]仙人掌 - 洛谷 | 计算机科学教育新生态 Solution 我们先考虑只有一棵树如何处理. 仙人掌可以看做若干环的集合. 特别的, 对于一条没 ...
- Nginx HTTP框架提供的请求相关变量
L73 binary_remote_addr 对端二进制IPV4或IPV6 一般用作限制用户请求缓存key connection 递增链接序号 connection_requests 一条TCP链接 ...
- Spring Boot报错 MultipartException The temporary upload...
Spring Boot报错:尤其是在处理Ribbon这类接口调用型的负载均衡组件,常见问题 ERROR o.a.c.c.C.[.[.[.[dispatcherServlet] - Servlet.se ...
- python——redis
redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...
- 老年OIer的Python实践记—— Codeforces Round #555 (Div. 3) solution
对没错下面的代码全部是python 3(除了E的那个multiset) 题目链接:https://codeforces.com/contest/1157 A. Reachable Numbers 按位 ...
- 转载:原来JavaScript的闭包是这么回事!
相关阅读:https://www.itcodemonkey.com/article/8565.html
- 「洛谷3338」「ZJOI2014」力【FFT】
题目链接 [BZOJ] [洛谷] 题解 首先我们需要对这个式子进行化简,否则对着这么大一坨东西只能暴力... \[F_i=\sum_{j<i} \frac{q_iq_j}{(i-j)^2}-\s ...