線程範圍內共享變量的概念與做用

1、圖解

2、多個線程訪問共享對象和數據的方式

    一、若是每一個線程執行的代碼相同,可使用同一個Runnable對象,這個Runnable對象中有那個共享數據,例如,買票系統就能夠這麼作。java

    二、若是每一個線程執行的代碼不一樣,這時候須要用不一樣的Runnable對象,有以下兩種方式來實現這些Runnable對象之間的數據共享。數據庫

        ① 將共享數據封裝在另一個對象中,而後將這個對象逐一傳遞給各個Runnable對象。每一個線程對共享數據的操做方法也分配到那個對象身上去完成,這樣容易實現針對該數據進行的各個操做的互斥和通訊。dom

        ② 將這些Runnable對象做爲某一個類中的內部類,共享數據做爲這個外部類中的成員變量,每一個線程對共享數據的操做方法也分配給外部類,以便實現對共享數據進行的各個操做的互斥和通訊,做爲內部類的各個Runnable對象調用外部類的這些方法。spa

        ③ 上面兩種方式的組合:將共享數據封裝在另一個對象中,每一個線程對共享數據的操做方法也分配到那個對象身上去完成,對象做爲這個外部類中的成員變量或方法中的局部變量,每一個線程的Runnable對象做爲外部類中的成員內部類或局部內部類。線程

        總之,要同步互斥的幾段代碼最好是分別放在幾個獨立的方法中,這些方法再放在同一個類中,這樣比較容易實現它們之間的同步互斥和通訊。code

    三、極端且簡單的方式,即在任意一個類中定義一個static的變量,這將被全部線程共享。對象

3、代碼說明

/** 
* @Title: ThreadScopeShareData.java 
* @Package com.lh.threadtest.t5 
* @Description: TODO
* @author Liu 
* @date 2018年1月16日 下午4:38:55 
* @version V1.0 
*/
package com.lh.threadtest.t5;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * @ClassName: MyThreadScopeShareData
 * @Description: 線程範圍內共享變量的概念與做用
 * 
 * 線程內共享,線程外獨立,如數據庫鏈接事務轉帳(各個操做線程相互獨立,互不影響,各個模塊操做數據各不一樣)
 * 線程內的共享變量及其做用
 * 
 * @author Liu
 * @date 2018年1月16日 下午4:38:55
 * 
 */
public class MyThreadScopeShareData {

	private static int data = 0;

	private static Map<Thread, Integer> dataMap = new HashMap<>();
	
	public static void main(String[] args) {
		for(int i = 0; i < 2; i++){
			new Thread(new Runnable() {
				
				public void run() {
					Integer data = new Random().nextInt();
					System.out.println(Thread.currentThread().getName()
							+ " has put data:" + data
							);
					dataMap.put(Thread.currentThread(), data);
					new A().get();
					new B().get();
					new C().get();
				}
			}).start();
		}
	}

	static class A {
		 void get(){
			Integer data = dataMap.get(Thread.currentThread());
			System.out.println("A from " + Thread.currentThread().getName()
					+ " get data:" + data
					);
		}
	}

	static class B {
		 void get(){
			Integer data = dataMap.get(Thread.currentThread());
			System.out.println("B from " + Thread.currentThread().getName()
					+ " get data:" + data
					);
		}
	}

	static class C {
		 void get(){
			Integer data = dataMap.get(Thread.currentThread());
			System.out.println("C from " + Thread.currentThread().getName()
					+ " get data:" + data
					);
		}
	}

}

3、應用場景

    一、數據庫鏈接事務轉帳(各個操做線程相互獨立,互不影響,各個模塊操做數據各不一樣)事務

相關文章
相關標籤/搜索