zoukankan      html  css  js  c++  java
  • 线程同步

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

  • 相关阅读:
    剑指offer(45)扑克牌顺子
    剑指offer(44)单词翻转序列
    剑指offer(43)左旋转字符串
    剑指offer(42)和为S的字符串
    剑指offer(41)和为S的连续正数序列
    剑指offer(40)数组中只出现一次的数字
    剑指offer(39)平衡二叉树
    面试金典——字符串压缩
    LeetCode——恢复二叉搜索树
    LeetCode——修剪二叉搜索树
  • 原文地址:https://www.cnblogs.com/itTeacher/p/2770186.html
Copyright © 2011-2022 走看看