JAVA併發編程梳理與學習--入門(線程之間的共享和協作)二

一、線程間的共享
synchronized (底層原理分析jvm時會說到)內置鎖
Java 支持多個線程同時訪問一個對象或者對象的成員變量,關鍵字 synchronized 可以修飾方法或者以同步塊的形式來進行使用,它主要確保多個線 程在同一個時刻,只能有一個線程處於方法或者同步塊中,它保證了線程對變量訪問的可見性和排他性,又稱爲內置鎖機制
對象鎖和類鎖
對象鎖是用於對象實例方法,或者一個對象實例上的,類鎖是用於類的靜態 方法或者一個類的 class 對象上的。我們知道,類的對象實例可以有很多個,但 是每個類只有一個 class 對象,所以不同對象實例的對象鎖是互不干擾的,但是 每個類只有一個類鎖。 但是有一點必須注意的是,其實類鎖只是一個概念上的東西,並不是真實存 在的,類鎖其實鎖的是每個類的對應的 class 對象。類鎖和對象鎖之間也是互不干擾的。
一個問題:執行下面代碼synchronized爲什麼沒用


    private Integer i;

    public TestIntegerThread(Integer i){
        this.i=i;
    }

    @Override
    public void run() {

        synchronized (i){
            i++;
            System.out.println(i);
        }
    }

    public static void main(String[] args){
        TestIntegerThread testIntegerThread=new TestIntegerThread(0);
        for(int i=0;i<5;i++){
            new   Thread(testIntegerThread).start();
        }

    }

這是執行結果,我們期望的是1,2,3,4,5
在這裏插入圖片描述
注意:synchronized鎖的是對象,一定要保證所鎖對象的不變性
二、ThreadLocal(面試經常會問到)
1.ThreadLocal定義:從名字看ThreadLocal叫線程變量,填充的變量屬於當前線程,每個線程都提供了變量的副本,使得每個線程在某一時間訪問到的並非同一個對象,這樣就隔離了多個線程對數據的數據共享。
2.使用場景:
1》在進行對象跨層傳遞的時候,使用ThreadLocal可以避免多次傳遞,打破層次間的約束。
2》線程間數據隔離
3》進行事務操作,用於存儲線程事務信息。
4》數據庫連接,Session會話管理。
spring事務管理應用了ThreadLocal
我們代碼一般都採用三層結構,我們會在service層調用dao方法,在dao對象的每個方法當中去打開事務和關閉事務。如何讓多個 dao 使用同一個數據源連接呢?我們就必須爲每個 dao傳遞同一個數據庫連接,要麼就是在 dao實例化的時候作爲構造方法的參數傳遞,要麼在每個dao的實例方法中作爲方法的參數傳遞。這兩種方式無疑對我們的 Spring 框架或者開發人員來說都不合適。爲了讓這個數據 庫連接可以跨階段傳遞,又不顯示的進行參數傳遞,就可以用ThreadLocal。
Web 容器中,每個完整的請求週期會由一個線程來處理。因此,如果我們能將一些參數綁定到線程的話,就可以實現在軟件架構中跨層次的參數共享(是隱式的共享)。
ThreadLocal 的使用
ThreadLocal 有 4 個方法:
• void set(Object value) 設置當前線程的線程局部變量的值。
• public Object get() 該方法返回當前線程所對應的線程局部變量。
• public void remove() 將當前線程局部變量的值刪除,目的是爲了減少內存的佔用,該方法是 JDK 5.0 新增的方法。需要指出的是,當線程結束後,對應該線程的局部變量將自動 被垃圾回收,所以顯式調用該方法清除線程的局部變量並不是必須的操作,但它可以加快內存回收的速度。
• protected Object initialValue() 返回該線程局部變量的初始值,該方法是一個 protected 的方法,顯然是爲 了讓子類覆蓋而設計的。這個方法是一個延遲調用方法,在線程第 1 次調用 get() 或 set(Object)時才執行,並且僅執行 1 次。ThreadLocal 中的缺省實現直接返回一 個 null。
public final static ThreadLocal threadLocal= new ThreadLocal();
threadLocal代表一個能夠存放String類型的ThreadLocal對象。
ThreadLocal分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章