溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java兩個線程對變量進行加1操作實例分析

發(fā)布時間:2022-03-17 10:39:59 來源:億速云 閱讀:245 作者:iii 欄目:大數(shù)據(jù)

本篇內(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ù)學習!

向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI