2016-03-24 8 views
-2
class hehe implements Runnable { 

    static int count = 0; 

    public synchronized void count() { 
    count++; 
    } 

    public void run() { 
    for (int i = 0; i < 10000; i++) { 
     count(); 
    } 
    } 
} 

public class Sychronise { 

    public static void main(String[] args) { 
    Thread a1 = new Thread(new hehe()); 
    Thread a2 = new Thread(new hehe()); 

    a1.start(); 
    a2.start(); 

    try { 
     a1.join(); 
     a2.join(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    System.out.println(hehe.count); 
    } 
} 

カウントは20000ですが、出力はまだ不安定です。それは、個々の「笑」のインスタンスで同期だとしてJavaスレッドは同期しています(出力は安定しません)

答えて

1

現在、あなたの同期化は何もしません。

public static synchronized void count(){ 
    count++; 
} 

をまたはオブジェクトで同期::それは(「数」変数を所有している)クラスのオブジェクトで同期させるにはあまりにもあなたのカウント方法は、静的作る

public class hehe implements Runnable { 
    static int count= 0; 
    static Object lock = new Object(); 

    public void count(){ 
     synchronized(lock) { 
      count++; 
     } 
    } 

    public void run(){ 
     for (int i=0;i<10000;i++){ 
      count(); 
     } 
    } 
} 
+0

それは動作します。どうもありがとうございました。 – Varrian

+0

は、私はそれが静的にする必要があり、それが作品 – Tibrogargan

0

ここに問題があることは、あなたのcountメソッドは同期されていますが、Heheオブジェクトのインスタンスが2つあるので、各同期は各インスタンスにスコープされます。この場合は、使用することをお勧めします。AtomicInteger

まず静的カウントメソッドを試してみてください。

public static synchronized void count(){ 
    count++; 
} 

public void run(){ 
    for (int i=0;i<10000;i++){ 
     Hehe.count(); 
    } 
} 
+0

:)をあなたに感謝してください答えを受け入れる@Varrian。 – Varrian

+0

@バリアンあなたは歓迎です、私の答えをupvoteして受け入れてください。 –

関連する問題