您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“java兩個線程對變量進行加1操作實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java兩個線程對變量進行加1操作實例分析”吧!
1--錯誤的常規(guī)寫法
public static int i=0;
public static void add(){
i=i+1;
action();
}
public static void action(){
System.out.println("==>"+Thread.currentThread().getName()+":"+i);
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(SysUserServiceImpl::add,"t1");
Thread t2= new Thread(SysUserServiceImpl::add,"t2");
t1.start();
t2.start();
}
運行結(jié)果==>
==>t1:1
==>t2:2
==>t1:2
==>t2:1
==>t1:2
==>t2:2
每次運行結(jié)果不一致,多線程環(huán)境下,t1對共享內(nèi)存中的i進行+1操作,但未將值刷新到主內(nèi)存,此時恰好t2也對i取到還是0進行+1操作,使得最后結(jié)果i都為1,同理t1處理完為1,t2處理完為2。多次運行結(jié)果都不一致。
改進方法1 --同步鎖
public class ThreadException {
public static volatile int i=0;
public static void add(){
synchronized (ThreadException.class){
i=i+1;
action();
}
}
public static void action(){
System.out.println("==>"+Thread.currentThread().getName()+":"+i);
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(ThreadException::add,"t1");
Thread t2= new Thread(ThreadException::add,"t2");
t1.start();
t2.start();
}
}
優(yōu)點:實現(xiàn)簡單
缺點:加鎖粒度大,性能低下,分布式環(huán)境,多JVM條件,synchronized失效,synchronized 只是本地鎖,鎖的也只是當前jvm下的對象,在分布式場景下,要用分布式鎖
改進方法2 AtomicInteger
public class ThreadException { private static AtomicInteger num = new AtomicInteger(0); public static void add(){ int i = num.getAndIncrement(); action(i); } public static void action(int i){ System.out.println("由"+i+"==>"+Thread.currentThread().getName()+":"+num); } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(ThreadException::add,"t1"); Thread t2= new Thread(ThreadException::add,"t2"); t1.start(); t2.start(); }}
改進方法3 lock
public class ThreadException {
public static volatile int i=0;
public static void action(){
System.out.println("==>"+Thread.currentThread().getName()+":"+i);
}
static Lock lock=new ReentrantLock();
public static void inc() {
lock.lock();
try {
Thread.sleep(1);
i=i+1;
action();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(ThreadException::inc,"t1");
Thread t2= new Thread(ThreadException::inc,"t2");
t1.start();
t2.start();
}
}
分布式鎖:保證多個節(jié)點同步執(zhí)行
實現(xiàn)方案:1。基于數(shù)據(jù)庫,2.基于redis緩存,3.基于zookeeper
到此,相信大家對“java兩個線程對變量進行加1操作實例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學習!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。