4

私はスレッドを初めて使用します。私は実際にJava並行性を読んでいます。私は本の中で次の例を見つけました。

@NotThreadSafe
public class UnSafeSequence
{
     private int value;
     public int getNext()
     {
         return value++;
     }
}

このクラスにアクセスするいくつかのスレッド(またはそれ以上)を記述してこのコードをテストし、スレッドの安全性を感じてもらいたいと思いました。

私はこれらのように試しましたが、これらの例を実際にテストする方法がわかりません。

class MyThread implemented Runnable
{
    public void run()
    {
        //Should I create a new object for UnSafeSequence here ?
    }
}

ご協力いただきありがとうございます。

4

3 に答える 3

6

このクラスにアクセスするいくつかのスレッド(またはそれ以上)を記述してこのコードをテストし、スレッドの安全性を感じてもらいたいと思いました。

各スレッドに独自のインスタンスがある場合UnSafeSequence、問題は発生しません。あなたがする必要があるのはUnSafeSequence、あなたのインスタンスの外のインスタンスを作成し、MyThreadそれをそれぞれのコンストラクターに渡すことMyThreadです。

 UnSafeSequence unsafe = new UnSafeSequence();
 ...
 new Thread(new MyThread(unsafe)).start();
 new Thread(new MyThread(unsafe)).start();
 ...
 class MyThread implemented Runnable {
       private UnSafeSequence unsafe;
       public MyThread(UnSafeSequence unsafe) {
            this.unsafe = unsafe;
       }
       public void run() {
            ...
            unsafe.getNext();
            ...
       }
 }

スレッドについて学習している間は、ExecutorServiceおよびその他の優れたクラスについて必ず読んでください。これは、Sun ^ H ^ H ^HOracleの優れたチュートリアルです。

于 2013-02-25T15:34:41.950 に答える
2

UnSafeSequenceいいえ、各スレッドでの新しいインスタンスを作成する場合run、独自のvalueメンバーがあり、これは問題を示しません。2つのオプションがあります:

  • 作成valueしてgetNext()静的にし、UnSafeSequence.getNext()

  • 共有オブジェクトを作成し、作成時にスレッドに渡します

    class MyThread implemented Runnable
    {
       UnSafeSequence unsafe;
       MyThread(UnSafeSequence unsafe) { this.unsafe = unsafe; }
       public void run() { /* call unsafe.getNext(); */ }
    }
    
于 2013-02-25T15:35:19.000 に答える
0

UnSafeSequenceスレッドごとに1つのインスタンスを作成でき、それは完全に安全です。N個のスレッドに対してこれを行うと、値のN個のコピーが作成されます。これは、問題の同期されていないデータです。

スレッドセーフでない方法でアクセスする場合は、の単一インスタンスを作成してUnSafeSequenceから、複数のスレッドからgetNext()を呼び出す必要があります。

于 2013-02-25T15:35:13.043 に答える