Java中给静态方法添加synchronized时候的锁
目录
在java
静态方法上面加synchronized
的时候,是把当前类的Class
类对象进行持锁。例如下面的例子:
Service.java
:分别提供两个静态方法和一个非静态方法
package com.yalexin.thread.demo03;
/**
* Author:Yalexin
* Email: 181303209@yzu.edu.cn
*/
public class Service {
synchronized public static void printA() {
System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
System.currentTimeMillis() + " 进入 printA()");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
System.currentTimeMillis() + " 退出 printA()");
}
synchronized public static void printB() {
System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
System.currentTimeMillis() + " 进入 printB()");
System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
System.currentTimeMillis() + " 退出 printB()");
}
synchronized public void printC() {
System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
System.currentTimeMillis() + " 进入 printC()");
System.out.println("thread name = " + Thread.currentThread().getName() + " 在 " +
System.currentTimeMillis() + " 退出 printC()");
}
}
线程A调用静态方法A
package com.yalexin.thread.demo03;
/**
* Author:Yalexin
* Email: 181303209@yzu.edu.cn
*/
public class ThreadA extends Thread{
public ThreadA(Service service) {
this.service = service;
}
private Service service;
@Override
public void run() {
service.printA();
}
}
线程B调用静态方法B
package com.yalexin.thread.demo03;
/**
* Author:Yalexin
* Email: 181303209@yzu.edu.cn
*/
public class ThreadB extends Thread{
public ThreadB(Service service) {
this.service = service;
}
private Service service;
@Override
public void run() {
service.printB();
}
}
进程C调用非静态方法C
package com.yalexin.thread.demo03;
/**
* Author:Yalexin
* Email: 181303209@yzu.edu.cn
*/
public class ThreadC extends Thread{
public ThreadC(Service service) {
this.service = service;
}
private Service service;
@Override
public void run() {
service.printC();
}
}
输出:
thread name = AAAA 在 1603940400153 进入 printA()
thread name = CCCC 在 1603940400153 进入 printC()
thread name = CCCC 在 1603940400153 退出 printC()
thread name = AAAA 在 1603940402169 退出 printA()
thread name = BBBB 在 1603940402169 进入 printB()
thread name = BBBB 在 1603940402169 退出 printB()
可以看到
A方法和B方法是同步的,是因为synchronized
关键字加到静态方法上面的时候,是将Service
类的Class
类对象作为锁,而C方法和A或者B方法是异步的,是因为synchronized
关键字加到非静态方法上面的时候,是将Service
类的实例化对象作为锁,即C方法的锁和A或B的锁是两个不同的锁,二者可以异步进行。
本文由「黄阿信」创作,创作不易,请多支持。
如果您觉得本文写得不错,那就点一下「赞赏」请我喝杯咖啡~
商业转载请联系作者获得授权,非商业转载请附上原文出处及本链接。
关注公众号,获取最新动态!
历史评论
开始评论