多線程的鎖,安全問題

a 當多條語句在操做同一個線程共享數據時,一個線程對多條語句的執行只執行了一部分,另外一個線程就參與進來執行,致使了共享數據錯誤;咱們就須要的是讓正在執行的線程執行完了再讓其餘線程執行;面試

b  同步的前提:1必需要有2個或2個以上的線程函數

                    二、必須是同一個線程使用同一個鎖this

c   業務邏輯寫在run()裏面,給線程起名字;spa

1:   同步代碼塊:synchronized(對象) {//裏面能夠放類的字節碼對象或者對象,其實鎖是是資源線程

須要被同步代碼code

}對象

package DuoThread;

class Test implements Runnable {
	private int tick = 100;
	
	public void run() {
		while(true) {
			synchronized(Test.class) {
				if(tick > 0) {
					try {
						Thread.sleep(10);
					}catch (Exception e){}
					System.out.println(Thread.currentThread().getName() + "...." + tick--);
				}
			}
		}
	}
}
public class Ticket2 {

	public static void main(String[] args) {
		Test t = new Test();
		Thread t1 =new Thread(t);
		Thread t2 =new Thread(t);
		Thread t3 =new Thread(t);
		Thread t4 =new Thread(t);

		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}

}

4個線程交替出票內存

2: 同步函數     (synchronized放在方法的void以前),非static的方法鎖是this,static方法的鎖是類的字節碼對象(xxx.class)資源

package DuoThread;

class Test implements Runnable {
	private int tick = 100;
	
	public synchronized void run() {
		while(true) {
			//synchronized(Test.class) {
				if(tick > 0) {
					try {
						Thread.sleep(10);
					}catch (Exception e){}
					System.out.println(Thread.currentThread().getName() + "...." + tick--);
				}
			//}
		}
	}
}
public class Ticket2 {

	public static void main(String[] args) {
		Test t = new Test();
		Thread t1 =new Thread(t);
		Thread t2 =new Thread(t);
		Thread t3 =new Thread(t);
		Thread t4 =new Thread(t);

		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}

}

只有一個線程在執行,由於一個線程執行了,其餘線程就進不去get

3.面試題: 3.1 2個同步方法,一個static,一個非static,他們能夠一塊兒被訪問,由於static在內存中只有一份,鎖的力度不一樣

                3.2 2個同步方法,不能同時訪問,由於他們都要獲取對象,會發生互斥

總之,就是看他們鎖的是否是同一個資源;

相關文章
相關標籤/搜索