synchronized()
線上程運作的時候,有時會出現線程安全問題
例如:買票程式,有可能會出現不同視窗買同一張編号的票
運作如下代碼:
public class runable implements Runnable {
//此處定義變量是一個對象的變量,run()函數調用的時候不同的線程調用
int i=1;
@Override
public void run() {
while(true){
//輸出目前線程名字和票數
System.out.println(Thread.currentThread().getName()+i);
i++;
//目前線程放棄CPU,重新競争資源
Thread.yield();
if(i>100)break;
}
}
}
public class main {
public static void main(String[] args) throws InterruptedException {
//實作接口
runable ra=new runable();
//生成Thread對象,并将接口對象作為參數
Thread t1=new Thread(ra);
Thread t2=new Thread(ra);
//給兩個線程設定名字
t1.setName("線程一");
t2.setName("線程二");
//開始線程
t1.start();
t2.start();
}
}
會出現如下情況:

處理方法:加入線程鎖
public class runable implements Runnable {
//此處定義變量是一個對象的變量,run()函數調用的時候不同的線程調用
int i=1;
@Override
public void run() {
//加入程序鎖,鎖住的是this這個對象,在this這個對象釋放CPU之前,所有的含有程序鎖的代碼都不能運作
synchronized (this) {
while(true){
//輸出目前線程名字和票數
System.out.println(Thread.currentThread().getName()+i);
i++;
//目前線程放棄CPU,重新競争資源
Thread.yield();
if(i>100)break;
}
}
}
}