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個同步方法,不能同時訪問,由於他們都要獲取對象,會發生互斥
總之,就是看他們鎖的是否是同一個資源;