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