• 线程同步


    研究了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产生的某个具体对象了)。

  • 相关阅读:
    C#解决界面不响应
    C#调用SendMessage 用法
    C#开机自动启动程序代码
    C# WinForm使用乐器数字接口
    以下C#程序的输出结果是( )。
    C# 关键字extern用法
    C#循环测试题
    C#播放wav文件
    Matches正则使用提取内容
    C#测试题若干,都是基础阿
  • 原文地址:https://www.cnblogs.com/itTeacher/p/2770186.html
Copyright © 2020-2023  润新知