Heim >Java >javaLernprogramm >Beispielcode-Freigabe der Java-Synchronisationssperre (synchronisiert)

Beispielcode-Freigabe der Java-Synchronisationssperre (synchronisiert)

黄舟
黄舟Original
2017-03-29 10:40:221846Durchsuche

Dieser Artikel stellt hauptsächlich die detaillierte Erklärung und Beispiele der Java-Synchronisationssperre (synchronisiert) vor. Freunde, die sie benötigen, können sich auf

Detaillierte Erklärung und Beispiele der Java-Synchronisationssperre (synchronisiert)

Die von der CPU jedem Thread in Java zugewiesene Zeitspanne ist zufällig. In Java teilen sich viele Threads dieselbe Ressource. Beim Verkauf von Bahntickets ist beispielsweise das Zugticket sicher, aber das Fenster für den Zugverkauf Tickets sind überall. Jedes Fenster entspricht einem Thread. So viele Threads teilen sich die Ressource aller Zugtickets. Wenn zwei Threads diese Ressource zu einem bestimmten Zeitpunkt gleichzeitig nutzen, sind die von ihnen entnommenen Bahntickets gleich (gleiche Sitzplatznummer), was zu Problemen für die Fahrgäste führt. Zum Beispiel das folgende Programm:

package com.pakage.ThreadAndRunnable; 
 
public class Runnable_demo implements Runnable{ 
  private int ticket=10; 
  public Runnable_demo(){    
  } 
  @Override 
  public void run() { 
    for(int i=0;i<20;i++){ 
        if(this.ticket>0){ 
          //休眠1s秒中,为了使效果更明显,否则可能出不了效果 
          try { 
            Thread.sleep(1000); 
          } catch (Exception e) { 
            e.printStackTrace(); 
          } 
          System.out.println(Thread.currentThread().getName()+"号窗口卖出:"+this.ticket--+"号票"); 
        } 
       
    } 
  } 
   
   public static void main(String args[]){ 
     Runnable_demo demo=new Runnable_demo(); 
     //基于火车票创建三个窗口 
     new Thread(demo,"a").start(); 
     new Thread(demo,"b").start(); 
     new Thread(demo,"c").start(); 
   } 
   
}
Ergebnisse der Programmausführung:

Beispielcode-Freigabe der Java-Synchronisationssperre (synchronisiert)

Wir können sehen, dass sowohl Fenster C als auch Fenster B verkauft sind Ticket Nr. 10 wurde gekauft und die Tickets Nr. 0 und -1 wurden an den Fenstern A bzw. B verkauft. Der Grund für diese Situation ist 1. Wenn der C-Thread und der B-Thread Ticket = 10 haben, nachdem der C-Thread das Ticket Nr. 10 herausgenommen hat, ist das Ticket noch nicht angekommen und wird um 1 reduziert, und der B-Thread nimmt es Zu diesem Zeitpunkt ist das Ticket immer noch gleich 10. 2. Wenn Ticket = 1, nimmt Thread c Ticket Nr. 1 heraus. Bevor das Ticket kommt, wird es um 1 dekrementiert. Threads a und b betreten das Wenn

Urteilsaussage zu diesem Zeitpunkt das Ticket um 1 verringert wird, erhalten die Threads a und b die Tickets Nr. 0 und -1.

Wie können wir die oben genannte Situation ändern? Zum Abschluss geben Sie die Sperre an einen anderen Thread weiter, der diese Ressource verwenden möchte

. Auf diese Weise wird die obige Situation nicht auftreten. Um diese Sperrfunktion zu implementieren, müssen Sie das synchronisierte Schlüsselwort verwenden.
Das synchronisierte Schlüsselwort hat zwei Verwendungszwecke

1. Platzieren Sie es vor dem Methodennamen, um eine synchronisierte Methode zu bilden. 2. Platzieren Sie es vor dem Block, um einen synchronisierten Block zu bilden.


1 Verwenden Sie die Synchronisierungsmethode, um das obige Beispiel wie folgt zu ändern:

Das Ausgabeergebnis des Programms ist:
package com.pakage.ThreadAndRunnable; 
 
public class Runnable_demo implements Runnable{ 
  private int ticket=10; 
  public Runnable_demo(){    
  } 
  @Override 
  public void run() { 
    for(int i=0;i<20;i++){ 
        if(this.ticket>0){ 
          //休眠1s秒中,为了使效果更明显,否则可能出不了效果 
          try { 
            Thread.sleep(1000); 
          } catch (Exception e) { 
            e.printStackTrace(); 
          } 
          this.sale(); 
        } 
       
    } 
  } 
   
  public synchronized void sale(){ 
    if(this.ticket>0){ 
      System.out.println(Thread.currentThread().getName()+"号窗口卖出:"+this.ticket--+"号票"); 
    } 
  } 
   
   public static void main(String args[]){ 
     Runnable_demo demo=new Runnable_demo(); 
     //基于火车票创建三个窗口 
     new Thread(demo,"a").start(); 
     new Thread(demo,"b").start(); 
     new Thread(demo,"c").start(); 
   } 
   
}

Beispielcode-Freigabe der Java-Synchronisationssperre (synchronisiert)

2. Verwenden Sie den Synchronisationsblock, um das obige Beispiel zu ändern:

Das Ausgabeergebnis des Programms:
package com.pakage.ThreadAndRunnable; 
 
public class Runnable_demo implements Runnable{ 
  private int ticket=10; 
  public Runnable_demo(){    
  } 
  @Override 
  public void run() { 
    for(int i=0;i<20;i++){ 
      <span style="color:#ff0000">synchronized</span>(this){ 
        if(this.ticket>0){ 
          //休眠1s秒中,为了使效果更明显,否则可能出不了效果 
          try { 
            Thread.sleep(1000); 
          } catch (Exception e) { 
            e.printStackTrace(); 
          } 
          System.out.println(Thread.currentThread().getName()+"号窗口卖出:"+this.ticket--+"号票"); 
        } 
      } 
       
    } 
  } 
   
   public static void main(String args[]){ 
     Runnable_demo demo=new Runnable_demo(); 
     //基于火车票创建三个窗口 
     new Thread(demo,"a").start(); 
     new Thread(demo,"b").start(); 
     new Thread(demo,"c").start(); 
   } 
   
}


Das obige ist der detaillierte Inhalt vonBeispielcode-Freigabe der Java-Synchronisationssperre (synchronisiert). 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