IT职涯

一个多年的IT人的博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

线程同步

Posted on 2012-11-14 16:44  IT职涯  阅读(373)  评论(0编辑  收藏  举报
研究了servlet是否线程安全后,又想起一个问题,就是如何考虑线程同步?

资料上说:线程安全问题都是由全局变量及静态变量引起的。而如果每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

那么在java中,如何考虑线程同步呢?
java里一般有2种方法进行同步:同步方法和同步语句块。
synchronized用于设置同步,它所定的是调用这个同步方法对象,也就是同一个对象在不同线程中执行这个方法时,他们是互斥的,但是这个方法所属的其他对象可以任意调用这个方法。

下面给出一些参考:

1。同步方法
Public synchronized void methodAAA()
{

//….

}

它等同于下面:
public void methodAAA()
{

synchronized (this)      //  this是调用这个方法的对象

{

       //…..

}

}

2。同步语句块
public void method3(SomeObject so)
{

       synchronized(so)

    {

               //…..

    }

}
锁就是so这个对象,当有一个明确的对象作为锁时,就可以这样写程序,但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:
class Foo implements Runnable
{

       private byte[] lock = new byte[0];  // 特殊的instance变量

        Public void methodA()

    {

               synchronized(lock) { //… }

    }

    //…..

}

3.将synchronized作用于static 函数,示例代码如下:

Class Foo
{

     public synchronized static void methodAAA()   // 同步的static 函数

     {

                 //….

     }

    public void methodBBB()

    {

               synchronized(Foo.class)   //  class literal(类名称字面常量)

    }

 }

   代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。