天天看點

java線程控制安全

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();
	}
}
      

  會出現如下情況:

java線程控制安全

處理方法:加入線程鎖

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;
			}
		}
		
	}
}