`
zhanglibin1986
  • 浏览: 374956 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中的同步synchronized

    博客分类:
  • Java
阅读更多
参考:http://developer.51cto.com/art/200906/132354.htm
http://developer.51cto.com/art/200906/132360.htm
第一种:
sychronized关键字只和一个对象实例绑定

   1. class Test 
   2. { 
   3.       public synchronized void method() 
   4.      { 
   5.            
   6.      } 
   7. } 
   8.   
   9. public class Sync implements Runnable 
  10. { 
  11.      private Test test; 
  12.      public void run() 
  13.      { 
  14.           test.method(); 
  15.      } 
  16.      public Sync(Test test) 
  17.      { 
  18.          this.test = test; 
  19.      } 
  20.      public static void main(String[] args) throws Exception 
  21.      { 
  22.          Test test1 =  new Test(); 
  23.          Test test2 =  new Test(); 
  24.          Sync sync1 = new Sync(test1); 
  25.          Sync sync2 = new Sync(test2); 
  26.          new Thread(sync1).start(); 
  27.          new Thread(sync2).start();  
  28.      } 
  29.  }

在Test类中的method方法是同步的。但上面的代码建立了两个Test类的实例,因此,test1和test2的method方法是分别执行的。要想让method同步,必须在建立Sync类的实例时向它的构造方法中传入同一个Test类的实例,如下面的代码所示:

Sync sync1 = new Sync(test1);     不仅可以使用synchronized来同步非静态方法,也可以使用synchronized来同步静态方法。如可以按如下方式来定义method方法:

   1. class Test  
   2. { 
   3.     public static synchronized void method() {   } 
   4. }

建立Test类的对象实例如下:

   1. Test test = new Test();

对于静态方法来说,只要加上了synchronized关键字,这个方法就是同步的,无论是使用test.method(),还是使用Test.method()来调用method方法,method都是同步的,并不存在非静态方法的多个实例的问题

在使用synchronized关键字时有以下四点需要注意:

1.  synchronized关键字不能继承。
2.  在定义接口方法时不能使用synchronized关键字。
3.  构造方法不能使用synchronized关键字,但可以使用下节要讨论的synchronized块来进行同步。
4.  synchronized可以自由放置。但要注意,synchronized不能放在方法返回类型的后面

大量使用synchronized关键字会造成不必要的资源消耗以及性能损失。

synchronized关键字有两种用法。第一种就是在上面讲的直接用在方法的定义中。另外一种就是synchronized块。我们不仅可以通过synchronized块来同步一个对象变量。也可以使用synchronized块来同步类中的静态方法和非静态方法。

注意:在使用synchronized块同步类方法时,非静态方法可以使用this来同步,而静态方法必须使用Class对象来同步。它们互不影响。当然,也可以在非静态方法中使用Class对象来同步静态方法。但在静态方法中不能使用this来同步非静态方法。这一点在使用synchronized块同步类方法时应注意。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics