核心提示: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锁对所有的对象实例都起作用。