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并将其传递给 each 的构造函数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^H Oracle 的一个很好的教程

于 2013-02-25T15:34:41.950 回答
2

不,如果您UnSafeSequencerun每个线程中创建一个新实例,将有自己的value成员,这不会显示问题。您有 2 个选项:

  • makevaluegetNext()static 并调用它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实例,这将是完全安全的。如果对 N 个线程执行此操作,您将拥有 N 个值副本,即有问题的非同步数据。

如果您想以线程不安全的方式访问它,您需要创建单个实例,UnSafeSequence然后从多个线程调用 getNext()。

于 2013-02-25T15:35:13.043 回答