Geben Sie ein Problem wie folgt an:
Die Lösung lautet wie folgt:
public class Demo_5 { public static void main(String[] args) { //创建一个窗口 TicketWindow tw1=new TicketWindow(); //使用三个线程同时启动 Thread t1=new Thread(tw1); Thread t2=new Thread(tw1); Thread t3=new Thread(tw1); t1.start(); t2.start(); t3.start(); } } //售票窗口类 class TicketWindow implements Runnable{ private int nums=2000; //一共2000张票 @Override public void run() { while(true){ if(nums>0){ //先判断是否还有票 //Thread.currentThread().getName()得到当前线程的名字 System.out.println(Thread.currentThread().getName()+"在售出第"+nums+"张票"); //显示售票信息 //出票的速度是一秒出一张 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } nums--; }else{ break; //售票结束 } } } }
Führen Sie diesen Code aus, um das Problem zu finden gleiche Ticketnummer Es kann an mehreren Ticketschaltern verkauft werden, und der Code, der Probleme verursacht, ist der if else-Anweisungsblock.
Die Lösung besteht darin, synchronisiert(Object){den Code, den Sie synchronisieren möchten} in dem Codesegment zu verwenden, das synchronisiert werden muss.
Der geänderte Code lautet wie folgt:
public class Demo_5 { public static void main(String[] args) { //创建一个窗口 TicketWindow tw1=new TicketWindow(); //使用三个线程同时启动 Thread t1=new Thread(tw1); Thread t2=new Thread(tw1); Thread t3=new Thread(tw1); t1.start(); t2.start(); t3.start(); } } //售票窗口类 class TicketWindow implements Runnable{ private int nums=2000; //一共2000张票 @Override public void run() { while(true){ //认为if else这段代码要保证其原子性(同步代码块) synchronized (this) { if(nums>0){ //先判断是否还有票 //Thread.currentThread().getName()得到当前线程的名字 System.out.println(Thread.currentThread().getName()+"在售出第"+nums+"张票"); //显示售票信息 //出票的速度是一秒出一张 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } nums--; }else{ break; //售票结束 } } } } }
Führen Sie diesen Code aus und stellen Sie fest, dass die Ticketausstellung normal ist.
Thread 1 führt Code aus, der synchronisiert werden muss. Threads 2, 3, 4 ... werden blockiert und in den Thread-Wartepool verschoben, genau wie jemand, der die Tür schließt (verriegelt), bevor er zur Toilette geht . Kommen Sie heraus (entsperren), wenn Sie fertig sind, und dann können andere es weiter verwenden.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Thread-Sicherheitsprobleme in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!