一、若是每一個線程執行的代碼相同,可使用同一個Runnable對象,這個Runnable對象中有那個共享數據,例如,買票系統就能夠這麼作。java
二、若是每一個線程執行的代碼不一樣,這時候須要用不一樣的Runnable對象,有以下兩種方式來實現這些Runnable對象之間的數據共享。數據庫
① 將共享數據封裝在另一個對象中,而後將這個對象逐一傳遞給各個Runnable對象。每一個線程對共享數據的操做方法也分配到那個對象身上去完成,這樣容易實現針對該數據進行的各個操做的互斥和通訊。dom
② 將這些Runnable對象做爲某一個類中的內部類,共享數據做爲這個外部類中的成員變量,每一個線程對共享數據的操做方法也分配給外部類,以便實現對共享數據進行的各個操做的互斥和通訊,做爲內部類的各個Runnable對象調用外部類的這些方法。spa
③ 上面兩種方式的組合:將共享數據封裝在另一個對象中,每一個線程對共享數據的操做方法也分配到那個對象身上去完成,對象做爲這個外部類中的成員變量或方法中的局部變量,每一個線程的Runnable對象做爲外部類中的成員內部類或局部內部類。線程
總之,要同步互斥的幾段代碼最好是分別放在幾個獨立的方法中,這些方法再放在同一個類中,這樣比較容易實現它們之間的同步互斥和通訊。code
三、極端且簡單的方式,即在任意一個類中定義一個static的變量,這將被全部線程共享。對象
/** * @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 ); } } }
一、數據庫鏈接事務轉帳(各個操做線程相互獨立,互不影響,各個模塊操做數據各不一樣)事務