参考:
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块同步类方法时应注意。