关键词:synchronized
synchronized是Java并发并发编程中提供了同步的关键字,可以保证原子性、可见性与有序性。synchronized是对某一具体的对象上锁。synchronized的使用方式包括:
- 在静态方法上使用
public static synchronized void m() {
......
}
- 在实例方法上使用
public synchronized void m() {
......
}
- 在方法代码块中使用
public void m() {
......
synchronized (object) {
......
}
......
}
下面分别看看在上面三种使用方式,synchronized锁住的范围是什么?
(1)验证:在静态方法上使用
①如下在类SynObject中,静态同步方法staticSynMethod。在线程中使用Thread.sleep阻塞5秒,用于模拟方法执行的耗时操作,方便观察多个线程是否存在阻塞。
public class SynObject {
public static synchronized void staticSynMethod() {
System.out.println(Thread.currentThread().getName()+"开始执行,时间戳:"+System.currentTimeMillis());
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("staticSynMethod");
}
}
②编写验证方法:
验证1:
public class Main {
public static void main(String[] args) {
new Thread(()->{
SynObject.staticSynMethod();
}, "threadA").start();
new Thread(()->{
SynObject.staticSynMethod();
}, "threadB").start();
}
}
直接使用SynObject类调用其静态方法,运行结果为下图所示。观察控制台输出以及时间戳,可以发现线程B是等待线程A执行完成staticSynMethod方法释放锁之后再执行的。(线程A与线程B哪个线程先执行,这个是不确定的,由系统的线程调度决定)