新建一個資源類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();
}
}