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

  • 相关阅读:
    开源cms系统We7插件开发准备工作全面就绪 开源CMS
    We7促销力度惊人:又开源又送iphone! 开源CMS
    开源cms系统:We7 CMS 2.5版内测版发布啦! 开源CMS
    开源cms系统的发展趋势 开源CMS
    We7 CMS支撑全新宁夏检察院门户网站 开源CMS
    We7开放式维基文档中心正式开通 开源CMS
    我公司签约成都申达科技打造校园行业网站群建设新的应用平台 开源CMS
    西部动力中标北京京能热电股份有限公司班组管理系统网站群项目 开源CMS
    SQL查数据库表,字段
    DataTable Excel
  • 原文地址:https://www.cnblogs.com/itTeacher/p/2770186.html
Copyright © 2011-2022 走看看