1. 程式人生 > >java的int型別執行緒安全

java的int型別執行緒安全

一、測試int為執行緒不安全

在java中,高併發/多執行緒情況下,int的自增自減操作都不是執行緒安全的,使用AtomicInteger可以保證。

package com.yezi.learn.atomic;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * Created by yezi on 2014/5/10.
 */
public class TestAtomicInteger {
    private int shareI=0;
    private AtomicInteger atomicLoop = new AtomicInteger(0);
    private int loop =0;
    public static void main(String []args) throws Exception{
        TestAtomicInteger t = new TestAtomicInteger();
        t.testMethod();
        System.out.println(t);
    }
    public void testMethod() throws Exception{
        Thread th1 = new Thread(new ThreadTest());
        Thread th2 = new Thread(new ThreadTest());
        th1.start();
        th2.start();
        th1.join();
        th2.join();
    }
    public synchronized void add(){
        shareI++;
    }
    class ThreadTest implements Runnable{
        @Override
        public void run() {
            //testAtomicInteger();
            testInt();
        }
    }
    public void testInt(){ //測試,輸出結果隨機,為執行緒不安全
        for(;loop<100000;loop++) {
            add();
        }
    }
    public void testAtomicInteger(){  //輸出1000000,執行緒安全
        for(;atomicLoop.getAndAdd(1)<100000;) {
            add();
        }
    }
    @Override
    public String toString() {
        return ""+shareI;
    }
}

二、AtomicIntegerFieldUpdater可以對Obj的欄位進行處理
package com.yezi.learn.atomic;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
/**
 * Created by yezi on 2014/5/10.
 */
public class TestAtomicObjectInteger {
    private Looper looper = new Looper();
    private int shareI=0;
    public static void main(String ...args) throws Exception{
        TestAtomicObjectInteger t = new TestAtomicObjectInteger();
        t.testMethod();
        System.out.println(t);
    }
    public void testNormal(){ //執行緒不安全的
        for(;looper.getLoop()<100000;looper.setLoop(looper.getLoop()+1)){
            add();
        }
    }
    public void testUseAtomic(){
        AtomicIntegerFieldUpdater<Looper> atomicIntegerFieldUpdater =  //使用Atomic來進行自加
                AtomicIntegerFieldUpdater.newUpdater(Looper.class,"loop");
        for(;atomicIntegerFieldUpdater.getAndAdd(looper,1)<100000;){
            add();
        }
    }
    public void testMethod() throws Exception{
        Thread th1 = new Thread(new ThreadTest());
        Thread th2 = new Thread(new ThreadTest());
        th1.start();
        th2.start();
        th1.join();
        th2.join();
    }
    class ThreadTest implements Runnable{
        @Override
        public void run() {
            testUseAtomic();
            //testNormal();
        }
    }
    public synchronized void add(){
        shareI++;
    }
    @Override
    public String toString() {
        return shareI+"";
    }
}
class Looper{
    public volatile int loop=0;  //對於AtomicIntegerFieldUpdater要控制的欄位必須為public volatile
    public int getLoop() {
        return loop;
    }
    public void setLoop(int loop) {
        this.loop = loop;
    }
}

相關推薦

java的int型別執行安全

一、測試int為執行緒不安全 在java中,高併發/多執行緒情況下,int的自增自減操作都不是執行緒安全的,使用AtomicInteger可以保證。 package com.yezi.learn.atomic; import java.util.concurrent.ato

Linux多執行學習(4) --讀寫鎖和其他型別的鎖以及執行安全

多執行緒學習總結(1):https://blog.csdn.net/hansionz/article/details/84665815 多執行緒學習總結(2):https://blog.csdn.net/hansionz/article/details/84675536 多執行緒學習總結

C/C++程式設計教訓----函式內靜態類物件初始化非執行安全(C++11之前)

不少程式設計師在編寫程式的時候,會使用函式內靜態(static)變數,既能滿足函式內這個變數可以持久的記錄某些資訊,又使其訪問範圍的控制侷限於函式內。但函式內靜態類物件初始化是非執行緒安全的。 問題背景 在我們產品中對log4cxx做了一些簡單的封裝 (採用VS2005編譯),其中會

十二、JVM(HotSpot)執行安全與鎖優化----終結篇

注:本博文主要是基於JDK1.7會適當加入1.8內容。 執行緒安全:當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行環境下的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的行為可以獲取正確的結果,那這個物件就是執行緒安全的。 1、Ja

Java多執行程式設計中執行的同步與互斥/執行安全/Java鎖

摘要:多執行緒三個特徵:原子性、可見性以及有序性.&gt;執行緒的同步與互斥?(同步執行緒與非同步執行緒,執行緒同步和非同步問題)&nbsp;&nbsp;1.同步:假設現有執行緒A和執行緒B,執行緒A需要往緩衝區寫資料,執行緒B需要從緩衝區讀資料,但他們之間存在一種制約

併發程式設計之多執行執行安全

什麼是執行緒安全? 為什麼有執行緒安全問題? 當多個執行緒同時共享,同一個全域性變數或靜態變數,做寫的操作時,可能會發生資料衝突問題,也就是執行緒安全問題。但是做讀操作是不會發生資料衝突問題。 案例: 需求現在有100張火車票,有兩個視窗同時搶火車票,請使用多執行緒模擬搶票效果。 p

Qt中實現執行安全的單例模式

之前專案中用到單例模式,用的是執行緒不安全的,這次專案用到了多執行緒,所以想到實現一個執行緒安全的單例模式。經過查詢資料,發現Qt本身有自己的執行緒安全單例模式實現方式。 Q_GLOBAL_STATIC巨集 使用方法:MonitorWindow.h #ifndef MONITORW

二、執行安全阻塞佇列 BlockingQueue 入門

一、BlockingQueue繼承關係 java.util.concurrent 包裡的 BlockingQueue是一個介面, 繼承Queue介面,Queue介面繼承 Collection BlockingQueue --> Queue –-> Collection

三、執行安全阻塞佇列 BlockingQueue 詳解

轉載自: https://www.cnblogs.com/WangHaiMing/p/8798709.html 本篇將詳細介紹BlockingQueue,以下是涉及的主要內容: BlockingQueue的核心方法 阻塞佇列的成員的概要介紹 詳細介紹DelayQu

設計模式之單例模式【內附物件例項化幾種方式、實現執行安全幾種方式】

繼續來複習常用的設計模式-單例模式,順便回憶一下執行緒安全的幾種實現方式。 一、什麼是單例模式 單例模式,簡單常用的一種設計模式,也很好的體現了程式碼控制物件在記憶體數量的一種方式,主要分2種實現方式: ①餓漢式,執行緒安全 ②懶漢式,執行緒不安全(新增鎖機制,可以實現執行緒安全)

java多執行2.執行安全之可見性

要編寫正確的併發程式,關鍵在於:在訪問共享的可變狀態時需要進行正確的管理 可見性: 同步的另一個重要目的——記憶體可見性。 我們不僅希望防止某個執行緒正在使用物件狀態而另一個執行緒同時在修改狀態,而且希望當一個執行緒修改了物件狀態後,其他執行緒能夠看到發生的狀態變化(互斥訪問/通訊效果

執行安全單例設計模式+序列化

懶漢式單例模式會引來執行緒安全問題,即多執行緒時可能會建立多個例項,而且在反序列化時也可能會建立新的例項。看了大大們的實現方式,覺得以下一種比較簡單方便理解。 一、下面是會造成執行緒安全的餓漢單例模式。用四列印下會發現hashcode不一致 public class Singleton {

33-多執行緒--賣票示例+執行緒安全(產生原因+解決方式:同步)+同步(同步程式碼塊+同步的好處與弊端+同步的前提+同步函式+賣票示例的同步函式寫法+驗證同步函式的鎖+驗證靜態同步函式的鎖)

一、賣票示例 需求:四個視窗,同時售賣100張票,票號為1-100 1、沒有多執行緒時的賣票程式碼 class Ticket { //100張票 private int num = 100; public void sale() { /

Java併發理論基礎—執行安全策略

不可變物件需要滿足的條件: 1、物件建立以後其狀態就不能修改 2、物件所有域都是final型別 3、物件是正確建立的(在物件建立期間,this引用沒有逸出) final關鍵字:類、方法、變數 修飾類:不能被繼承 修飾方法:1、鎖定方法不被繼承類修改;2、效率 修飾變數:基

執行中的佇列不一定需要執行安全

兩個執行緒,主執行緒中update update(){   while(queue.count >0){     //process....     queue.pop()   } }   子執行緒中: queue.enqueue(data)   這樣做是沒有問

Java筆試題(三)——執行安全、String、StringBuffer、StringBuilder

1.什麼是執行緒安全? 簡單地說法:執行緒安全可以簡單理解為一個方法或者一個例項可以在多執行緒環境中使用而不會出現問題。 複雜的說法:當多個執行緒訪問同一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要進行額外的同步,或者在呼叫方進行任何其他的協調操作,呼叫這個物件的

執行安全問題(迸發)入門知識總結

關於Java解決執行緒衝突的方法簡單總結 1.在方法面前使用synchronized或者使用方法塊 2.使用各種鎖lock,Reentrantlock,讀寫鎖 3.使用volatile保證可見性 4.使用ThreadLock複製變數副本 5.java.util.concurrent的API及St

servlet的 執行安全問題&建立時機改變&對映細節

 Servlet的細節:  a: servlet 的執行緒安全問題:    1) Servlet是單例的, 不安全的。    當Servlet的例項被建立後,自始至終在駐留在記憶體當中。 只有一份。   

JVM——執行安全的實現方法

一互斥同步(悲觀的併發策略) 同步是指在多個執行緒併發訪問共享資料時,保證共享資料在同一時刻只被一個執行緒使用。互斥是實現同步的一種手段,下面介紹兩種互斥同步的手段:synchronized關鍵字和concurrent包中的重入鎖ReentrantLock synchronized關鍵字:

Java語言中的執行安全

執行緒安全定義:當多個執行緒訪問一個物件時,如果不用考慮這些執行緒在執行時環境下的排程和交替執行,也不需要考慮進行額外的同步,或者在呼叫方進行任何其他的寫作操作,呼叫這個物件的行為都可以獲得正確的結果,那這個物件時執行緒安全的。 將Java語言中的各種操作共享的資料分為以下五類: 不可