小编Jyo*_*rge的帖子

为自定义屏障设计测试类

我必须使用锁作为我课程工作的一部分来实现自定义障碍类.为了测试我的LockBarrier课程,我提出了以下测试代码.它工作正常,但我担心这是否是正确的方法.你能否提出我可以做的改进,特别是构建课程.我认为我的编码方式不正确.欢迎任何建议.

public class TestDriver 
{
        private static LockBarrier barrier;

        static class Runnable1 implements Runnable
        {
            public Runnable1()
            { }

            public void run()
            {
                try
                {
                    System.out.println(Thread.currentThread().getId()+" lazy arrived at barrier");
                    Thread.sleep(10000);
                    barrier.await();
                    System.out.println(Thread.currentThread().getId()+" passed barrier");           

                }
                catch (InterruptedException ie)
                {
                    System.out.println(ie);
                }
            }     

        }

        static class Runnable2 implements Runnable
        {       

            public Runnable2()
            { } 

            public void run()
            {
                try
                {
                    System.out.println(Thread.currentThread().getId()+" quick arrived at barrier");

                    //barrier.await(1,TimeUnit.SECONDS);
                    barrier.await();
                    System.out.println(Thread.currentThread().getId()+" passed barrier");
                }               
                catch (InterruptedException ie)
                {
                    System.out.println(ie);
                }
            } …
Run Code Online (Sandbox Code Playgroud)

java multithreading

2
推荐指数
1
解决办法
2531
查看次数

使用compareAndSet进行线程安全

以下演示代码如何线程安全?我们确保是否在CAS指令中修改了值,然后对int进行了增量.不会return v + 1;超越整个目的,因为它可以跳过线程的更新.

这里原子整数用于模仿非阻塞的int计数器.

//Here value is an atomic integer
public int increment() 
{
   int v;
   for(;;) 
   {
      v = value.get();
      if(value.compareAndSet(v, v + 1))
         return v + 1;   
   }
}
Run Code Online (Sandbox Code Playgroud)

代码不应该是这样的:

public int increment() 
{
   int v;
   for(;;) 
   {
      v = value.get();
      if(value.compareAndSet(v, v + 1))
         return value.get();   
   }
}
Run Code Online (Sandbox Code Playgroud)

java multithreading

0
推荐指数
1
解决办法
516
查看次数

标签 统计

java ×2

multithreading ×2