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

本篇內容主要講解“java兩個線程對變量進行加1操作實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java兩個線程對變量進行加1操作實例分析”吧!

創新互聯公司堅持“要么做到,要么別承諾”的工作理念,服務領域包括:網站建設、網站設計、企業官網、英文網站、手機端網站、網站推廣等服務,滿足客戶于互聯網時代的永興網站設計、移動媒體設計的需求,幫助企業找到有效的互聯網解決方案。努力成為您成熟可靠的網絡建設合作伙伴!

1--錯誤的常規寫法

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();}運行結果==>==>t1:1==>t2:2
==>t1:2==>t2:1
==>t1:2==>t2:2

每次運行結果不一致,多線程環境下,t1對共享內存中的i進行+1操作,但未將值刷新到主內存,此時恰好t2也對i取到還是0進行+1操作,使得最后結果i都為1,同理t1處理完為1,t2處理完為2。多次運行結果都不一致。

改進方法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();
   }}

優點:實現簡單

缺點:加鎖粒度大,性能低下,分布式環境,多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();    }}

分布式鎖:保證多個節點同步執行
實現方案:1。基于數據庫,2.基于redis緩存,3.基于zookeeper

到此,相信大家對“java兩個線程對變量進行加1操作實例分析”有了更深的了解,不妨來實際操作一番吧!這里是創新互聯網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

當前名稱:java兩個線程對變量進行加1操作實例分析
標題URL:http://m.kartarina.com/article10/piphdo.html

成都網站建設公司_創新互聯,為您提供網站制作企業建站網站收錄網站策劃網站內鏈

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

手機網站建設
主站蜘蛛池模板: 人妻少妇无码精品视频区| 精品久久久久久无码人妻热 | 久久伊人亚洲AV无码网站| 小泽玛丽无码视频一区| 久久伊人亚洲AV无码网站| AV无码久久久久不卡蜜桃| 人妻无码精品久久亚瑟影视| 国产精品无码一区二区三级| 国产精品无码制服丝袜| 无码欧精品亚洲日韩一区| 免费无码AV一区二区| 精品无码久久久久国产| 成人av片无码免费天天看| 无码被窝影院午夜看片爽爽jk | 中文字幕无码久久久| 无码少妇丰满熟妇一区二区| 久久无码无码久久综合综合| 亚洲AV无码成H人在线观看 | 欧洲黑大粗无码免费| 亚洲AV无码精品蜜桃| 亚洲av永久无码精品国产精品| 国内精品久久久久久无码不卡| 亚洲a∨无码男人的天堂| 国产爆乳无码视频在线观看| 精品无码人妻久久久久久| 久久久久无码精品国产h动漫| 97久久精品亚洲中文字幕无码| 亚洲精品无码久久千人斩| 国产亚洲美日韩AV中文字幕无码成人| 无码办公室丝袜OL中文字幕 | 国模无码人体一区二区| 国产精品无码久久av不卡| 全免费a级毛片免费看无码| 亚洲精品9999久久久久无码| 无码国内精品人妻少妇| 久久国产亚洲精品无码| 久久亚洲AV无码精品色午夜| 日韩精品久久无码中文字幕| 特级无码毛片免费视频尤物| 久久久久无码精品国产| av区无码字幕中文色|