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:
Urteilsaussage zu diesem Zeitpunkt das Ticket um 1 verringert wird, erhalten die Threads a und b die Tickets Nr. 0 und -1.
. 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
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(); } }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!