Heim  >  Artikel  >  Java  >  Detaillierte Erläuterung der Thread-Sicherheitsprobleme in Java

Detaillierte Erläuterung der Thread-Sicherheitsprobleme in Java

黄舟
黄舟Original
2017-08-09 09:15:471651Durchsuche

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn