2010-08-31 20 views
9

Java'da yeniyim ve bir Eşzamanlı Programlama kursuna katılıyorum. Çaresiz bir şekilde, 'senkronize edilmiş' anahtar kelimeyi kullanmak ve bir nesneyi iş parçacıkları arasında paylaşmak gibi öğrendiğim kavramları göstermeye yardımcı olabilecek minimum bir çalışma örneği elde etmeye çalışıyorum. Arıyorsunuz, ancak temel bir çerçeve elde edilemedi. Java programcıları, yardım edin.İki iş parçacığı ile ana program arasındaki bir nesneyi paylaşma

cevap

4

İki iş parçacığı arasında bir diziyi paylaşmanın çok iyi bir örneği. Genellikle tüm sıfırları görürsünüz, ama bazen işler kötüleşir ve diğer sayıları görürsünüz.

final int[] arr = new int[100]; 
Thread one = new Thread() { 
    public void run() { 
     // synchronized (arr) { 
      for (int i = 0; i < arr.length * 100000; i++) { 
       arr[i % arr.length]--; 
      } 
     // } 
    } 
}; 
Thread two = new Thread() { 
    public void run() { 
     // synchronized (arr) { 
      for (int i = 0; i < arr.length * 100000; i++) { 
       arr[i % arr.length]++; 
      } 
     //} 
    } 
}; 
one.start(); 
two.start(); 
one.join(); 
two.join(); 
for (int i = 0; i < arr.length; i++) { 
    System.out.println(arr[i]); 
} 

Ama, her zaman baskı dışarı tüm 0 s göreceksiniz döngü etrafında arr kilidinde eğer. Senkronize edilmiş bloğu beğenmezseniz, kod hatasız olarak çalışır.

+2

Ayrıca, sadece artırma ve eksiltme çizgileri için 'arr 'üzerinde senkronizasyon yaparak hataları ortadan kaldırabilirsiniz: http://pastebin.com/vN4E527P Bu, yalnızca iş parçacığı güvensiz parçaların bu iki satır olması gerçeğinin altını çizer. –

+0

Bazen bir dizi rasgele sayı alıyorum. Şaşkınım. Çalışmayı açıklayabilir misiniz? – devnull

+0

Arr [i% arr.length] - ve arr [i% arr.length] ++ aynı sayıda yürütülürken dengesiz mi olmalıdır? Başka bir deyişle sonuç her zaman sıfır olmamalıdır? – devnull

7

Basit bir örnek. Umarım futbolu (ya da futbolu) seversin. :)

public class Game { 

public static void main(String[] args) { 
    Ball gameBall = new Ball(); 
    Runnable playerOne = new Player("Pasha", gameBall); 
    Runnable playerTwo = new Player("Maxi", gameBall); 

    new Thread(playerOne).start(); 
    new Thread(playerTwo).start(); 
} 

} 

public class Player implements Runnable { 

private final String name; 
private final Ball ball; 

public Player(String aName, Ball aBall) { 
    name = aName; 
    ball = aBall; 
} 

@Override 
public void run() { 
    while(true) { 
    ball.kick(name); 
    } 
} 

} 

public class Ball { 

private String log; 

public Ball() { 
    log = ""; 
} 

//Removing the synchronized keyword will cause a race condition. 
public synchronized void kick(String aPlayerName) { 
    log += aPlayerName + " "; 
} 

public String getLog() { 
    return log; 
} 

} 
+1

Bu nasıl bir yarış durumu gösterir? – jjnguy

+0

Daha belirgin hale getirmek için birkaç tane daha Oyuncu nesnesi hazırlayın. – Mike

+0

Görebildiğim kadarıyla, oyuncu isimleri arasında değişecektir. Ancak, zorunlu olarak birbirlerinin değil, çünkü bu bağlam değişiminin nasıl işlediği. – jjnguy

İlgili konular