新建一個資源類Resource
定義成員變量String name
定義成員變量int age
新建一個輸入類Input,實現Runnable接口
定義一個構造方法Input(),傳入參數:Resource對象
實現run()方法
定義while(true)往Resuorce對象的屬性賦值
新建一個輸出類Output,實現Runnable接口
定義一個構造方法Output(),傳入參數:Resource對象
實現run()方法
定義while(true)打印Resuorce對象的屬性
main方法中
獲取Resource對象,new出來
獲取Input對象,new出來,構造參數:Resource對象
獲取Output對象,new出來,構造參數:Resource對象
獲取Thread對象,new出來,構造參數:Runnable對象
調用Thread對象的start()方法,開啟線程
此時會有線程安全問題,查看結果可以發現,漢字和拼音的混了
陶士涵=====男
taoshihan=====nan
陶士涵=====nan
陶士涵=====nan
陶士涵=====男
陶士涵=====男
陶士涵=====nan
陶士涵=====nan
taoshihan=====nan
taoshihan=====nan
使用synchronized(){}同步代碼塊包裹操作同一個資源的地方
注意同步線程的個數,所有的線程都應該加上
注意是否是同一個鎖,synchronized()括號內的鎖參數:保證是個唯一的資源
使用synchronized(){}包裹上面的賦值和打印,鎖:Resource對象(唯一的)
查看結果,此時沒有安全問題
陶士涵=====男
陶士涵=====男
陶士涵=====男
taoshihan=====nan
taoshihan=====nan
taoshihan=====nan
死鎖問題:同步中嵌套同步,並且鎖不一致,此時會造成死鎖問題
/** * 資源 * * @author taoshihan * */ class Resource { String name; String sex; } /** * 輸入 * * @author taoshihan * */ class Input implements Runnable { private Resource resource; public Input(Resource resource) { this.resource = resource; } @Override public void run() { // 切換 boolean flag = true; while (true) { synchronized (resource) { if (flag) { resource.name = "taoshihan"; resource.sex = "nan"; } else { resource.name = "陶士涵"; resource.sex = "男"; } flag = !flag; } } } } /** * 輸出 * * @author taoshihan * */ class Output implements Runnable { private Resource resource; public Output(Resource resource) { this.resource = resource; } @Override public void run() { while (true) { synchronized (resource) { System.out.println(resource.name + "=====" + resource.sex); } } } } public class InputOutputDemo { /** * @param args */ public static void main(String[] args) { Resource resource = new Resource(); Input input = new Input(resource); Output output = new Output(resource); Thread t1 = new Thread(input); Thread t2 = new Thread(output); t1.start(); t2.start(); } }