核心提示:synchronized加到静态方法上或者synchronized(class)代码块是给Class类上锁。Class锁对类的所有对象都其作用。例如:1、创建一个Service类package com...
synchronized加到静态方法上或者synchronized(class)代码块是给Class类上锁。Class锁对类的所有对象都其作用。例如:
1、创建一个Service类
package com.iie;
/**
* Created by bo on 2018/3/29.
*/
public class Service {
synchronized public static void printA() {
try {
System.out.println("线程名称为:" + Thread.currentThread().getName() + "在:" + System.currentTimeMillis() + "进入printA");
Thread.sleep(3000);
System.out.println("线程名称为:" + Thread.currentThread().getName() + "在:" + System.currentTimeMillis() + "离开printA");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
synchronized public static void printB() {
try {
System.out.println("线程名称为:" + Thread.currentThread().getName() + "在:" + System.currentTimeMillis() + "进入printB");
Thread.sleep(3000);
System.out.println("线程名称为:" + Thread.currentThread().getName() + "在:" + System.currentTimeMillis() + "离开printB");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
2、创建线程ThreadA调用printA()方法,线程ThreadB调用printB()方法。
package com.iie;
/**
* Created by bo on 2018/3/29.
*/
public class ThreadA extends Thread {
private Service service;
public ThreadA(Service service) {
this.service = service;
}
@Override
public void run() {
service.printA();
}
}
package com.iie;
/**
* Created by bo on 2018/3/29.
*/
public class ThreadB extends Thread {
private Service service;
public ThreadB(Service service) {
this.service = service;
}
@Override
public void run() {
service.printB();
}
}
3、创建main线程,运行。
package com.iie;
/**
* Created by bo on 2018/3/26.
*/
public class Run {
public static void main(String[] args) throws InterruptedException {
Service serviceA = new Service();
Service serviceB = new Service();
ThreadA threadA = new ThreadA(serviceA);
threadA.setName("a");
ThreadB threadB = new ThreadB(serviceB);
threadB.setName("b");
threadA.start();
threadB.start();
}
}
执行结果:

可以看到,虽然创建了两个对象,但是还是同步执行,即Class锁对所有的对象实例都起作用。


