对Java同步一些理解

原创 2005年02月26日 21:03:00

对Java同步一些理解
kingfish 2005
------------------------------------------------------------
基本概念:
  每个Object都会有1个锁.
  同步就是串行使用一些资源.

(说明:以下有些例子为了突出重点,省略了不必要的代码.特别是省掉了一些成员变量,就是需要同步的对象.)

1. 多线程中对共享、可变的数据进行同步.
   对于函数中的局部变量没必要进行同步.
   对于不可变数据,也没必要进行同步.

   多线程中访问共享可变数据才有必要.


2. 单个线程中可以使用synchronized,而且可以嵌套,但无意义.
   class Test {
     public static void main(String[] args) {
         Test t = new Test();
         synchronized(t) {
           synchronized(t) {
              System.out.println("ok!");
           }
         }
     }
   }
  
3. 对象实例的锁
   class Test{
     public synchronized void f1(){
         //do something here
     }

     public void f2(){
        synchronized(this){
           //do something here
         }
     }
   }
 
   上面的f1()和f2()效果一致, synchronized取得的锁都是Test某个实列(this)的锁.
   比如: Test t = new Test();
         线程A调用t.f2()时, 线程B无法进入t.f1(),直到t.f2()结束.

   作用: 多线程中访问Test的同一个实例的同步方法时会进行同步.

4. class的锁
   class Test{
       final static Object o= new Object();

       public static synchronized void f1(){
          //do something here
       }
 
       public static void f2(){
         synchronized(Test.class){
           //do something here
         }
       }
  
      public static void f3(){
        try {
          synchronized (Class.forName("Test")) {
          //do something here
          }
        }
        catch (ClassNotFoundException ex) {
        }
      }
     
       public static void g(){
          synchronized(o){
            //do something here
          }
       }
   }

   上面f1(),f2(),f3(),g()效果一致
   f1(),f2(),f3()中synchronized取得的锁都是Test.class的锁.
  
   g()是自己产生一个对象o,利用o的锁做同步
   作用: 多线程中访问此类或此类任一个实例的同步方法时都会同步. singleton模式lazily initializing属于此类.

5. static method
   class Test{
      private static int v = 0;

      public static void f1(){
        //do something, 但函数中没用用到v
      }

      public synchronized static void f2(){
        //do something, 函数中对v进行了读/写.
      }  
   }

   多线程中使用Test的某个实列时,
    (1) f1()是线程安全的,不需要同步
    (2) f2()这个静态方法中使用了函数外静态变量,所以需要同步.

6.  对线程的run()进行同步没有意义,如 public synchronized void run()
    class Test extends Thread{
      public synchronized void run(){
        while(true){
           //do something
        }
      }
     
      public synchronized void f(){
         //...
      }
    }
    这种例子会有一个问题, 执行run()时(内部在循环), 外部无法执行f()


    class Test extends Thread{
       public synchronized void run(){
         //do something
       }
    }
    这种例子同步基本没用, 因为run()通常靠 new Test().start()来执行的.
    因为Test实例不同,锁也不同.

   
-------------------------------------------------------------------------
如有任何问题,请大家指正!


 

对Java同步一些理解

Java对多线程的支持与同步机制深受大家的喜爱,似乎看起来使用了synchronized关键字就可以轻松地解决多线程共享数据同步问题。到底如何?――还得对synchronized关键字的作用进行深入了...
  • starspirit
  • starspirit
  • 2010-10-12 12:57:00
  • 224

(java学习)关于对java中的同步和异步的理解

关于java中的同步和异步的区别,对于我这种java基础比较薄弱的人来说,一直没搞清楚他在代码中是怎么样提现的,也对这方面不敏感,平时写代码也就敲敲方法,然后遇到了考核,就让我们谈谈同步和异步,当时就...
  • Jack_YWJ
  • Jack_YWJ
  • 2016-08-06 15:41:11
  • 3442

Java多线程与并发(二)之线程同步

android培训——我的java笔记,期待与您交流!线程同步1 . 多线程共享数据 在多线程操作中, 多个线程有可能同时处理同一个资源, 这就是多线程中的共享数据。 举个不太恰当的例子简单...
  • u013144863
  • u013144863
  • 2016-05-10 23:40:14
  • 1518

浅谈对java集合的理解

首先是集合的框架图, 图片来源 Java集合是java提供的一个工具包,全部继承自java.util.*。主要包括两大接口Collection接口和Map接口以及相关的工具类(Iterator...
  • kiwi4814
  • kiwi4814
  • 2016-09-20 21:13:50
  • 1654

对Ajax同步异步的理解

这个要跟同步的概念一起理解,举个同步的例子 就是当你浏览页面的时候,你点击一个按钮或者链接,那么这个界面就会向服务器发送请求,此时你眼前的界面就是一片空白,直到请求的数据返回页面上才有东西显示。就是一...
  • qfikh
  • qfikh
  • 2016-09-14 22:54:10
  • 2108

Java小白进阶之四---说说IO流中的一些小细节

最近一直在加班,所以更新没跟上。这两天又看了IO流,发现了好多自己以前不会或模糊的问题,今天在这里说一说,有哪里不对的希望各位指教。(列举的可能比较碎) 细节一:(关于File的) 如果在创建...
  • RMS_1992
  • RMS_1992
  • 2016-11-10 18:01:37
  • 202

关于多线程中同步和异步的理解

线程同步:就是多个线程同时访问同一资源,必须等一个线程访问结束,才能访问其它资源,比较浪费时间,效率低 线程异步:访问资源时在空闲等待时可以同时访问其他资源,实现多线程机制 说起来比较抽象,我用代...
  • TP465821361
  • TP465821361
  • 2016-08-15 22:30:57
  • 647

说说对JAVA的认识

我就来说JAVA吧本来我也没资格说的,毕竟才学了两年,其他的语言也没怎么多接触,就当是献丑了。如果学java是为了考试,没有必要看这篇帖子。个人意见,仅供参考。java是一门非常简单的语言。    所...
  • aid666
  • aid666
  • 2005-03-15 09:29:00
  • 3459

java中线程同步的理解(非常通俗易懂)

我们可以在计算机上运行各种计算机软件程序。每一个运行的程序可能包括多个独立运行的线程(Thread)。 线程(Thread)是一份独立运行的程序,有自己专用的运行栈。线程有可能和其他线程共享一些资...
  • u012179540
  • u012179540
  • 2014-11-01 21:20:58
  • 7523

深入理解java---反射篇

深入理解java---反射篇  背景    在Java中如果我们预先不知道一个对象的确切类型,RTTI可以告诉你,但是有一个限制,那就是在编译的时候这个对象类型必须是确定的(需要有一个确定的编译类型...
  • yinbingqiu
  • yinbingqiu
  • 2016-10-29 10:37:15
  • 903
收藏助手
不良信息举报
您举报文章:对Java同步一些理解
举报原因:
原因补充:

(最多只允许输入30个字)