多线程与高并发(2)
时间:2020-10-21
本文章向大家介绍多线程与高并发(2),主要包括多线程与高并发(2)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
volatile
- 保证线程可见性
- 禁止指令重排序
DCL单例是否需要加volatile
package com.liyuanchen.designPattern;
/**
* 双重检查线程安全单例模式需要加上volatile禁止指令重排序才能使对象中的成员变量值绝对正确
*/
public class DCLTest {
public static volatile DCLTest INSTANCE;
private DCLTest(){
}
public static DCLTest getInstance(){
if (null == INSTANCE) {
synchronized (DCLTest.class) {
if (null == INSTANCE) {
INSTANCE = new DCLTest();
}
}
}
return INSTANCE;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(() -> {
System.out.println(DCLTest.getInstance().hashCode());
}).start();
}
}
}
volatile并不能代替synchronized,因为它不能保证多线程对变量的非原子操作数据正确。
CAS(Compare And Set/Swap 乐观锁 无锁优化)
cas是一种乐观锁机制,它有三个参数,一个当前内存值、旧的预期值、即将更新的值,仅当预期值与当前值相同时,将内存值修改为即将更新的值病返回true,否则什么都不做,返回false。
java中的Atomic原子类就是以CAS方式实现,如果更新不成功,则以自旋的方式继续进行操作。
CAS的ABA问题
旧的预期值在对比时与当前内存值是一致的,但是在比较之前与获取旧的预期值这段时间中发生过改变并且改回了原来的值,这时候就是CAS的ABA问题。
通常在CAS实现中加一个version字段来记录版本号来避免ABA问题。Java中AtomicStampedReference实现了这个处理方式。
原文地址:https://www.cnblogs.com/allen167/p/13854993.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- java_static、final、super、this关键字的使用
- Lambda表达式
- java_字节流、字符流
- HashMap源码分析
- [周末往期回顾]使用cx_Oracle连接Oracle
- java_数组的定义与操作
- LinkedList源码分析
- MarkDown语法的详细使用教程
- java_内部类、匿名内部类的使用
- [周末往期回顾]使用BBED定位数据位置
- JeecgCloud版,新建项目。
- MySQL忘记root密码,错误号码1045解决办法
- java_流程控制语句、权限修饰符
- [Oracle 故障处理]记一次RMAN备份警告的处理过程
- [Oracle 日常管理]使用oradebug捕获SQL语句