2010-08-31 16 views
9

मैं जावा के लिए नया हूँ और मैं एक समवर्ती प्रोग्रामिंग पाठ्यक्रम में भाग लेने रहा हूँ के बीच एक वस्तु साझा करना। मैं बेहद कम काम करने वाला उदाहरण प्राप्त करने की कोशिश कर रहा हूं जो 'सिंक्रनाइज़' कीवर्ड का उपयोग करने और थ्रेड में ऑब्जेक्ट साझा करने जैसी अवधारणाओं को प्रदर्शित करने में मदद कर सकता है। खोज रहे हैं, लेकिन बुनियादी ढांचा नहीं मिल सका। जावा प्रोग्रामर, कृपया मदद करें।दो धागे और मुख्य कार्यक्रम

उत्तर

4

यहां दो धागे के बीच एक सरणी साझा करने का एक बहुत ही शॉट उदाहरण है। आम तौर पर आप सभी शून्य देखेंगे, लेकिन कभी-कभी चीजें खराब हो जाती हैं और आप अन्य नंबर देखते हैं।

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]); 
} 

लेकिन, यदि आप पाशन आप हमेशा प्रिंट आउट में सभी 0 रों देखेंगे आसपास arr पर सिंक्रनाइज़ करें। यदि आप सिंक्रनाइज़ किए गए ब्लॉक को अनमोल करते हैं, तो कोड बिना त्रुटि के चलाएगा।

+2

आप केवल वृद्धि और कमी लाइनों के लिए 'arr' पर सिंक्रनाइज़ करके त्रुटियों से छुटकारा पा सकते हैं: http://pastebin.com/vN4E527P यह इस तथ्य को रेखांकित करता है कि केवल थ्रेड-असुरक्षित भाग उन दो पंक्तियां हैं। –

+0

कभी-कभी मुझे यादृच्छिक संख्याओं की एक स्ट्रिंग मिल रही है। मैं हैरान हूँ। क्या आप कृपया कामकाज की व्याख्या कर सकते हैं? – devnull

+0

एआर [i% arr.length] - और arr [i% arr.length] ++ संतुलन नहीं करना चाहिए क्योंकि इसे समान संख्या में निष्पादित किया जा रहा है? दूसरे शब्दों में नतीजा हमेशा शून्य नहीं होना चाहिए? – devnull

7

एक साधारण उदाहरण। आशा है कि आप फुटबॉल (या फुटबॉल) पसंद करेंगे। :)

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

यह कैसे एक रेस स्थिति दिखाता है? – jjnguy

+0

इसे और अधिक स्पष्ट बनाने के लिए कुछ और प्लेयर ऑब्जेक्ट्स को इंस्टेंट करें। – Mike

+0

जहां तक ​​मैं देख सकता हूं, यह प्लेयर नामों के बीच वैकल्पिक होगा। लेकिन, जरूरी नहीं कि हर दूसरे, क्योंकि यह सिर्फ संदर्भ स्विचिंग कैसे काम करता है। – jjnguy

संबंधित मुद्दे