我在写原子积分器和原子布尔的单元测试。 它们用作参考测试并在中使用
objective-c测试这些类的模拟并将其用于翻译项目。
我觉得自动整合器的测试很好。 主要通过在大量for循环中执行可预测数量的增量、减量、加法和减法操作,每个循环都在自己的线程上执行(每种操作类型都有很多线程)。 实际操作使用CountDownLatch同时开始。
所有线程完成后,通过将原子整数与预期的整数值进行比较来断言。 根据线程数,每次线程的迭代次数和每次迭代的预期变动。 这个测试通过了。
但是如何测试自动布尔呢? 因为基本操作是get和set,所以在许多线程中多次调用并期望最终结果为true或false似乎没有意义。 我想的方向是使用始终具有相反值的自动布尔。 这样:
@Test
public void测试属性() throws Exception { )。
//====SETUP====
finalatomicbooleanbooleana=newatomicboolean (true;
finalatomicbooleanbooleanb=newatomicboolean (false;
final int threadCount=50;
finalintiterationsperthread=5000;
finalcountdownlatchstartsignallatch=newcountdownlatch (1;
finalcountdownlatchthreadsfinishedlatch=newcountdownlatch (thread count );
finalatomicbooleanassertfailed=newatomicboolean (false;
//====execute : startall threads===
for(intI=0; i threadCount; I ) {
//====Create the thread=====
AtomicOperationsThread thread;
thread=newatomicoperationsthread (' thread # ' I,booleanA,booleanB,startSignalLatch,threadsFinishedLatch,iteration
system.out.println (creating thread # ' I );
//===startthethread (eachthreadwillwaituntilthestartsignallatchistriggered (=====)
thread.start (;
}
startSignalLatch.countDown (;
//===verify : thattheatomicintegerhastheexpectedvalueafterallthreadshavefinished==
final boolean allThreadsFinished;
allthreadsfinished=threadsfinishedlatch.await (60,TimeUnit.SECONDS );
资产真(notallthreadshavefinishedbeforereachingthetimeout )、allThreadsFinished );
资产故障(资产故障. get ) );
}
私有身份证明
//##### Instance variables #####
私有财务计数下载服务启动信令;
privatefinalcountdownlatchthreadsfinishedlatch;
私有财务中断;
私有金融工具;
私有金融服务失败;
//##### Constructor #####
privateatomicoperationsthread (finalstringname,final AtomicBoolean booleanA,final AtomicBoolean booleanB, finalcountdownlatch finalcountdownlatchthreadsfinishedlatch,final int iterations,final AtomicBoolean assertFailed ) {
超级用户(name;
this.booleanA=booleanA;
this.booleanB=booleanB;
this.startsignallatch=startsignallatch;
this.threadsfinishedlatch=threadsfinishedlatch;
this.iterations=iterations;
this.assertFailed=assertFailed;
}
//# # # # # thread implementation # # # # #
@Override
公共void run (}
super.run (;
//====waitforthesignaltostart (soallthreadsareexecutedsimultaneously )=====
try {
system.out.println (this.getname (' has started.awaitingstartsignal.' );
startSignalLatch.await (;/* awaiting开始信号* /
} catch (互联互通) )
thrownewruntimeexception (' thestartsignallatchgotinterrupted.',e );
}
//====performtheatomicoperations====
for(intI=0; I隔离; I ) {
final boolean booleanAChanged;
booleanachanged=booleana.compareandset (! booleanB.get (,Booleanb.getandset ) booleanB.get );/* setatothecurrentvalueofbifaiscurrentlytheoppositeofb,then set B to the current value of A */
if (! 布尔交换) {
资产故障. set (true;
system.out.println (assertfailedinthread : ) this.getname );
}
}
//====温柔的星月this thread as finished=====
threadsFinishedLatch.countDown (;
}
}
这适用于一个线程,但失败了多个。我想这是因为booleanachanged=booleana.compareandset ()! booleanB.get (,Booleanb.getandset ) booleanB.get ); 不是原子操作。
你有什么建议?