Java 如何测试非线程安全类?

Java 如何测试非线程安全类?,java,multithreading,Java,Multithreading,我是个新手。我正在实践中阅读Java并发。我在书中找到了下面的例子 @NotThreadSafe public class UnSafeSequence { private int value; public int getNext() { return value++; } } 我想通过编写几个(或更多)线程访问这个类来测试这段代码,以获得线程安全感 我试过这样做,但不确定如何测试这些示例 class MyThread impleme

我是个新手。我正在实践中阅读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 ?
    }
}
谢谢你的帮助

我想通过编写几个(或更多)线程访问这个类来测试这段代码,以获得线程安全感

如果每个线程都有自己的
UnSafeSequence
实例,那么它就不会说明问题。您需要做的是在
MyThread
实例之外创建
UnSafeSequence
的实例,并将其传递给每个
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
和其他优秀的类。这里有一个。

您可以为每个线程创建一个
UnSafeSequence
实例,这将是完全安全的。如果对N个线程执行此操作,则将有N个值的副本,这是有问题的非同步数据


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

否,如果在
run
中创建
UnSafeSequence
的新实例,则每个线程都将有自己的
成员,这不会显示问题。您有两种选择:

  • value
    getNext()
    设为静态,并使用
    UnSafeSequence.getNext()

  • 创建一个共享对象,并在创建时将其传递给线程

    class MyThread implemented Runnable
    {
       UnSafeSequence unsafe;
       MyThread(UnSafeSequence unsafe) { this.unsafe = unsafe; }
       public void run() { /* call unsafe.getNext(); */ }
    }
    

非线程安全代码的问题在于,该代码可以执行n次,但仍然可以生成n次正确的结果。