一点关于java多线程编程的效率问题

        在我的上一篇关于java多线程编程的同步的博客中,提到了一个概念临界区域,即所谓的公共资源区,在同一时刻只允许一个线程访问,并且当一个线程正在占用临界区域时,其他的线程将不能进入临界区域,只能进行等待。打一个比喻,不同的车辆在不同的车道上行驶,行驶到某一个位置,有一段只有一个车道的道路,并且只允许一个车辆进入通信,怎样来提高效率呢,很显然,我们只有使得这样的单车道道路尽可能的短和当不必要的时候,尽量没有这种车道,整体的效率才会更高。因此在多线程编程中,有些地方我们不可避免的要通过对临界区加锁来保证结果的正确性,而一段加锁了,程序效率必然会下降,因此我们只有设计更好的模式,使得临界区尽可能的小,这样才能在保证结果正确性的前提下,提高效率。下面我们看一个函数的两个版本;

版本一:

public static test1 newInstance()

{

    synchronized(test1.class)  ..........①

   {

               if(null==instance)

                       instance = new  test1();

   }

   return instance;

}

版本二:

public static test2 newInstance()

{

    if(null == instance).........①

    {         

           synchronized(test1.class)

           {

                  if(null==instance)

                          instance = new  test1();

           }

    }

    return instance;

}

        在版本一中,如果有多个线程运行到①处,只能有一个线程进入到临界区域,其他的线程只能阻塞,因此这样的话效率就降低了,而在第二个版本中,多个线程运行到①处,有一个线程进入临界区域,将会对instance负值,因此其他线程在①出的判断将不会成立,就退出,不会阻塞在①处,这种处理,在一定程度上很好的降低了因为等待临界区域而带来的效率问题。在这个处理方法中即减少了临界区域的范围,通过变量的来告诉其他线程临界区中已经有线程占用,就可以让其他线程不要盲目的都阻塞在此处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值