总览
- 多线程+对象在方法内部
- 多线程+对象在方法外部
- 多线程+单对象+synchronized
- 多线程+多对象+synchronized
- 多线程+synchronized+static
- 多线程+单对象+synchronized+static
- 多线程+多对象+synchronized+static
多线程+多对象+synchronized+static(例子)
Service类
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() {
System.out.println("线程名称为:" + Thread.currentThread().getName() +
"在" + System.currentTimeMillis() + "进入printB");
System.out.println("线程名称为:" + Thread.currentThread().getName() +
"在" + System.currentTimeMillis() + "离开printB");
}
}
ThreadA.java
public class ThreadA extends Thread {
private Service service;
public ThreadA(Service service) {
this.service = service;
}
@Override
public void run() {
//注意这里是对象调用
service.PrintA();
}
}
ThreadB.java
public class ThreadB extends Thread {
private Service service;
public ThreadB(Service service) {
this.service = service;
}
@Override
public void run() {
//注意这里是对象调用
service.printB();
}
}
Run.java
public class Run {
public static void main(String[] args) {
//这里使用2个对象
Service service1 = new Service();
Service service2 = new Service();
ThreadA a = new ThreadA(service1);
a.setName("A");
a.start();
ThreadB b = new ThreadB(service2);
b.setName("B");
b.start();
}
}
运行结果
总结
- 结果是同步的,就是因为Class锁是对所有对象实例起作用的。