一点关于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负值,因此其他线程在①出的判断将不会成立,就退出,不会阻塞在①处,这种处理,在一定程度上很好的降低了因为等待临界区域而带来的效率问题。在这个处理方法中即减少了临界区域的范围,通过变量的来告诉其他线程临界区中已经有线程占用,就可以让其他线程不要盲目的都阻塞在此处。

你可能感兴趣的:(java,多线程)