您的位置:首页 > 编程语言 > Java开发

java synchronized总结

2015-05-29 10:57 387 查看
一句话总结:

每个类,每个对象都有一个锁,当在方法或者代码块中添加了synchronized关键字时,要访问这个方法或者这个代码块时就需要获取对应的锁,没有添加synchronized则不受影响。

举例说明:

1、举例的类

package com.sync;

public class TestSync {

private Object lock = new Object();

public synchronized void doMethodA() {

System.out.println("start method A..");

for (int i = 0; i < 10; i++) {

System.out.println("A:" + i);

}

System.out.println("finish method A..");

}

public void doMethodB() {

System.out.println("start method B..");

synchronized (this) {

for (int i = 0; i < 10; i++) {

System.out.println("B:" + i);

}

}

System.out.println("finish method B..");

}

public static synchronized void doMethodC() {

System.out.println("start method C..");

for (int i = 0; i < 10; i++) {

System.out.println("C:" + i);

}

System.out.println("finish method C..");

}

public void doMethodD() {

System.out.println("start method D..");

synchronized (TestSync.class) {

for (int i = 0; i < 10; i++) {

System.out.println("D:" + i);

}

}

System.out.println("finish method D..");

}

public void doMethodE() {

System.out.println("start method E..");

synchronized (lock) {

for (int i = 0; i < 10; i++) {

System.out.println("E:" + i);

}

}

System.out.println("finish method E..");

}

public void doMethodF() {

System.out.println("start method F..");

synchronized (lock) {

for (int i = 0; i < 10; i++) {

System.out.println("F:" + i);

}

}

System.out.println("finish method F..");

}

public void doMethodG() {

System.out.println("start method G..");

for (int i = 0; i < 10; i++) {

System.out.println("G:" + i);

}

System.out.println("finish method G..");

}

}

1、给类实例添加synchronized

方法doMethodA()与doMethodB就是给类实例添加了synchronized,它们是互斥的,同一时间只能执行doMethodA()方法或者doMethodB方法中的代码块

2、给类对象与类添加synchronized

方法doMethodA()与方法doMethodC()一个是对类实例同步,一个是对类同步,它们将不是互斥的,可以同时执行

3、给类添加synchronized

方法doMethodC()与方法doMethodD(),它们是互斥的,同一时间只能执行doMethodC()方法或者doMethodD方法中的代码块

4、对其他类对象添加synchronized

方法doMethodE()与方法doMethodF()是互斥的,因为他们使用同一个类对象实例

5、方法doMethodE()不会跟doMethodA、doMethodB、doMethodC、doMethodD互斥

6、方法doMethodG()不会跟doMethodA、doMethodB、doMethodC、doMethodD、doMethodE互斥,它不需要锁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: