一句话总结:
每个类,每个对象都有一个锁,当在方法或者代码块中添加了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互斥,它不需要锁