并發(fā):多個(gè)線程操作相同的資源闰围,保證線程安全赃绊,合理使用資源
高并發(fā):服務(wù)能同時(shí)處理很多請(qǐng)求,提高程序性能
線程安全性
CAS=compareAndSwap羡榴,拿當(dāng)前對(duì)象的值和底層的值進(jìn)行對(duì)比信认,前對(duì)象的值和底層的值一致時(shí)執(zhí)行對(duì)應(yīng)的操作蜻直,不一樣就不停取最新的值另玖,直到相同的時(shí)候才執(zhí)行操作袱贮。
CAS 死循環(huán)內(nèi)不斷嘗試修改目標(biāo)值直到修改成功,如果競(jìng)爭(zhēng)不激烈的時(shí)候修改成功概率很高迄沫。競(jìng)爭(zhēng)激烈的時(shí)候修改失敗的概率很高稻扬,不斷嘗試就會(huì)影響性能。
long羊瘩,double jvm 允許將64位的讀操作或者寫操作拆成2個(gè)32位的操作泰佳。
LongAdder的實(shí)現(xiàn)思想:熱點(diǎn)數(shù)據(jù)分離。把a(bǔ)tomicLong value分離為數(shù)組困后,每個(gè)線程訪問(wèn)時(shí)通過(guò)hash等算法映射到其中一個(gè)數(shù)組計(jì)數(shù)乐纸,最終的計(jì)數(shù)結(jié)果是數(shù)組的求和累加衬廷,熱點(diǎn)數(shù)據(jù)value就被分離成多個(gè)單元摇予,提高了并行度。高并發(fā)分散提高性能吗跋,但準(zhǔn)確度會(huì)有偏差侧戴。
序列號(hào)生成的情況宁昭,準(zhǔn)確的數(shù)值的情況,全局統(tǒng)一計(jì)數(shù)的情況還是應(yīng)該選擇atomic
synchronized和Atomic比較重要
可見(jiàn)性
volatile不具備原子性酗宋,使用條件:
對(duì)變量的寫操作不依賴于當(dāng)前值
該變量沒(méi)有包含在具有其他變量的不變式子中
適合作為狀態(tài)標(biāo)記量积仗,和雙重檢測(cè)(單例模式)
有序性
安全發(fā)布對(duì)象
單例模式
/**
* 懶漢模式
* 單例的實(shí)例在第一次使用時(shí)創(chuàng)建
* 線程不安全
*/
public class SingletonExample1 {
//私有構(gòu)造函數(shù)
private SingletonExample1(){
}
//單例對(duì)象
private static SingletonExample1 instance = null;
//靜態(tài)的工廠方法
public static SingletonExample1 getInstance(){
if(instance == null){
instance = new SingletonExample1();
}
return instance;
}
}
/**
* 懶漢模式
* 單例的實(shí)例在第一次使用時(shí)創(chuàng)建
* 線程安全
*/
public class SingletonExample3 {
//私有構(gòu)造函數(shù)
private SingletonExample3(){
}
//單例對(duì)象
private static SingletonExample3 instance = null;
//靜態(tài)的工廠方法
public static synchronized SingletonExample3 getInstance(){
if(instance == null){
instance = new SingletonExample3();
}
return instance;
}
}
/**
* 懶漢模式 --- 雙重同步鎖單例模式
* 單例的實(shí)例在第一次使用時(shí)創(chuàng)建
* 線程不安全
*/
public class SingletonExample4 {
//私有構(gòu)造函數(shù)
private SingletonExample4(){
}
// 1、memory = allocate() 分配內(nèi)存空間
// 2蜕猫、ctorInstance() 初始化對(duì)象
// 3寂曹、instance = memory 設(shè)置instance指向剛分配的內(nèi)存
//JVM和cpu優(yōu)化,發(fā)生了指令重排
// 1回右、memory = allocate() 分配內(nèi)存空間
// 3隆圆、instance = memory 設(shè)置instance指向剛分配的內(nèi)存
// 2、ctorInstance() 初始化對(duì)象
//單例對(duì)象
private static SingletonExample4 instance = null;
//靜態(tài)的工廠方法
public static SingletonExample4 getInstance(){
if(instance == null){ //雙重檢測(cè)機(jī)制
synchronized(SingletonExample4.class){//同步鎖
if(instance == null) {
instance = new SingletonExample4();
}
}
}
return instance;
}
}
/**
* 懶漢模式 --- 雙重同步鎖單例模式
* 單例的實(shí)例在第一次使用時(shí)創(chuàng)建
* 線程安全
*/
public class SingletonExample5 {
//私有構(gòu)造函數(shù)
private SingletonExample5(){
}
// 1翔烁、memory = allocate() 分配內(nèi)存空間
// 2渺氧、ctorInstance() 初始化對(duì)象
// 3、instance = memory 設(shè)置instance指向剛分配的內(nèi)存
//JVM和cpu優(yōu)化蹬屹,發(fā)生了指令重排
// 1侣背、memory = allocate() 分配內(nèi)存空間
// 3、instance = memory 設(shè)置instance指向剛分配的內(nèi)存
// 2慨默、ctorInstance() 初始化對(duì)象
//單例對(duì)象 volatile + 雙重檢測(cè)機(jī)制 -> 禁止指令重排
private volatile static SingletonExample5 instance = null;
//靜態(tài)的工廠方法
public static SingletonExample5 getInstance(){
if(instance == null){ //雙重檢測(cè)機(jī)制
synchronized(SingletonExample5.class){//同步鎖
if(instance == null) {
instance = new SingletonExample5();
}
}
}
return instance;
}
}
/**
* 餓漢模式
* 單例的實(shí)例在類裝載時(shí)創(chuàng)建
* 線程安全
*/
public class SingletonExample2 {
//私有構(gòu)造函數(shù)
private SingletonExample2(){
}
//單例對(duì)象
private static SingletonExample2 instance = new SingletonExample2();
//靜態(tài)的工廠方法
public static SingletonExample2 getInstance(){
return instance;
}
}
/**
* 餓漢模式
* 單例的實(shí)例在類裝載時(shí)創(chuàng)建
* 線程安全
*/
public class SingletonExample6 {
//私有構(gòu)造函數(shù)
private SingletonExample6(){
}
//單例對(duì)象
private static SingletonExample6 instance = null;
static{
instance = new SingletonExample6();
}
//靜態(tài)的工廠方法
public static SingletonExample6 getInstance(){
return instance;
}
public static void main(String[] args) {
System.out.println(getInstance().hashCode());
System.out.println(getInstance().hashCode());
}
}
/**
* 枚舉模式:最安全贩耐,推薦使用
* @author WangCH
* @create 2018-03-21 21:23
*/
public class SingletonExample7 {
private SingletonExample7(){
}
public static SingletonExample7 getInstance(){
return Singleton.INSTANCE.getInstance();
}
private enum Singleton{
INSTANCE;
private SingletonExample7 singletonExample7;
//JVM保證絕對(duì)只被調(diào)用1次
Singleton(){
singletonExample7 = new SingletonExample7();
}
public SingletonExample7 getInstance() {
return singletonExample7;
}
}
}