麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

(原創(chuàng))確保JAVA線程安全的4種常用方法

2019-11-14 14:57:14
字體:
供稿:網(wǎng)友

java中可以有很多方法來保證線程安全,比如使用同步方法、同步塊,使用原子類(atomic concurrent classes),實(shí)現(xiàn)并發(fā)鎖,使用volatile關(guān)鍵字,使用不變類和線程安全類。

這里是最基礎(chǔ)的線程安全教程

實(shí)際上在volatile的使用上很容易有誤解,以為volatile就可以做原子操作,實(shí)際不然。Volatile 變量具有 synchronized 的可見性特性,但是不具備原子特性。這就是說線程能夠自動發(fā)現(xiàn) volatile 變量的最新值。Volatile 變量可用于提供線程安全,但是只能應(yīng)用于非常有限的一組用例:多個變量之間或者某個變量的當(dāng)前值與修改后值之間沒有約束。因此,單獨(dú)使用 volatile 還不足以實(shí)現(xiàn)計數(shù)器、互斥鎖或任何具有與多個變量相關(guān)的不變式(Invariants)的類(例如 “start <=end”)。

對于volatile修飾的變量,jvm虛擬機(jī)只是保證從主內(nèi)存加載到線程工作內(nèi)存的值是最新的。

直接上代碼:

import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Counter {        public static int count = 0; //對于值引用來說,多線程操作的是變量的副本,操作完后刷新到主存中.所以不具有原子性。    //錯誤的volatile使用方法,volatil只是直接進(jìn)行內(nèi)存地址操作,但并不能保證線程安全.volatile很容易被誤用,用來進(jìn)行原子性操作,    public volatile static int volatileCount = 0;     static Object obj =new Object();    public static AtomicInteger atomicCount;// 正確的方法1,使用原子操作        static class MyObject{// 正確的方法4,使用地址引用,多線程是通過地址操作。值的改變是同一個變量(地址)        static int mycount=0;        }    public static void inc1() {        MyObject.mycount++;    }       public static void inc() {        //這里延遲1毫秒,使得結(jié)果明顯        try {            Thread.sleep(1);        } catch (InterruptedException e) {        }                //典型錯誤1:在資源對象加鎖顯然是不對的,實(shí)際上毫無意義        //Lock lock =new ReentrantLock();             //lock.lock();        //synchronized (obj)  // 正確的方法2,可重人的同步塊操作。這也是最常用的辦法        {            count++;            volatileCount++;            atomicCount.incrementAndGet();        }        //lock.unlock();    }     public static void main(String[] args) {         //同時啟動100個線程,去進(jìn)行i++計算,看看實(shí)際結(jié)果        atomicCount =new AtomicInteger(0);        Lock lock =new ReentrantLock(); // 正確的方法3,可重人鎖   ReentrantLock        Thread threads[]=new Thread[100];         for (int i = 0; i < 100; i++) {            threads[i]=new Thread(new Runnable() {                @Override                public void run() {                    //lock.lock();// 正確的方法3,可重人鎖   ReentrantLock                    Counter.inc();                    //lock.unlock();                     inc1();                }            });            threads[i].start();        }                //保障線程全部結(jié)束        for(int i=0;i<100;i++){            try {                threads[i].join();            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.PRintStackTrace();            }        }         //如果沒有同步鎖.值有可能不同。        System.out.println("運(yùn)行結(jié)果1:Counter.count=" + Counter.count);        //atomicCount值都應(yīng)該是一致的        System.out.println("運(yùn)行結(jié)果2:Counter.atomicCount=" + Counter.atomicCount);        //atomicCount值。如果沒有同步鎖.值有可能不同。        System.out.println("運(yùn)行結(jié)果3:Counter.volatileCount=" + Counter.volatileCount);        //使用地址引用,多線程是通過地址操作。值的改變是同一個變量(地址)。值都應(yīng)該是一致的        System.out.println("運(yùn)行結(jié)果4:Counter.mycount=" +MyObject.mycount);    }        }

 

運(yùn)行之后,結(jié)果可能會這樣

運(yùn)行結(jié)果1:Counter.count=96
運(yùn)行結(jié)果2:Counter.atomicCount=100
運(yùn)行結(jié)果3:Counter.volatileCount=97
運(yùn)行結(jié)果4:Counter.mycount=100

 

如果在52行和54行取消注釋(或者取消32行的注釋),結(jié)果必然如下:

運(yùn)行結(jié)果1:Counter.count=100
運(yùn)行結(jié)果2:Counter.atomicCount=100
運(yùn)行結(jié)果3:Counter.volatileCount=100
運(yùn)行結(jié)果4:Counter.mycount=100

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 精品国产一区二区三区四区在线 | 久久9色 | 免费一级毛片电影 | 国产一区国产二区在线观看 | 91av日韩| 国产在线精品一区二区三区 | 毛片在线不卡 | 毛片免费在线观看 | 日本残忍极度灌浣肠视频 | 香蕉秀| 成年人毛片视频 | 亚洲综合91 | 毛片免费观看视频 | 久久精品亚洲国产奇米99 | 一区二区三区日韩 | 91成人午夜性a一级毛片 | 日本网站一区 | 亚州综合一区 | 黄网站色成年大片免费高 | 一级做受毛片免费大片 | 黄色av网站在线观看 | 亚洲精品欧美二区三区中文字幕 | 在线观看免费av网 | 视频在线亚洲 | 99精彩视频在线观看 | 日韩999| fc2成人免费人成在线观看播放 | 欧美成年视频 | 羞羞的视频在线观看 | 毛片一级免费看 | 黄污网址| 牛牛a级毛片在线播放 | 久久久www成人免费毛片 | 国内精品视频饥渴少妇在线播放 | 美女网站黄在线观看 | 国产成人精品一区在线播放 | 国内精品久久久久久2021浪潮 | 黄色视屏免费观看 | 免费h片网站 | av免费在线观看av | 久久精品视频网址 |