synchronized关键字
synchronized的使用
synchronized同步块是Java 提供的一种原子性内置锁,Java中每个对象都可以把他当做一个同步锁来使用,这些Java内置的使用者看不到的锁被称之为内置锁,也叫做监视器锁。
加锁方式
分类 | 具体分类 | 被锁对象 | 伪代码 |
---|---|---|---|
方法 | 实例方法 | 类的实例对象 | public synchronized void method(){ ... ... } |
方法 | 静态方法 | 类对象 | public static synchronized void method(){ ... ... } |
代码块 | 实例对象 | 类的实例对象 | synchronized (this){ ... ... } |
代码块 | class对象 | 类对象 | synchronized (Demo.class){ ... ... } |
代码块 | 任意实例对象Object | 实例对象Object | String lock = ""; synchronized (lock ){ ... ... } |
synchronized验证抽象类
线程SyncSonA:执行开始
线程SyncSonB:执行开始
线程SyncSonB:加锁执行5s
线程SyncSonA:加锁执行5s
线程SyncSonA:执行逻辑A–1s
线程SyncSonA:执行结束,毫秒:6013
线程SyncSonB:执行逻辑B–耗时3s
线程SyncSonB:执行结束,毫秒:8011
package sync;
import java.util.concurrent.TimeUnit;
public abstract class AbstractSyncFather {
public void process() throws InterruptedException {
// 开始时间
long startTime = System.currentTimeMillis();
System.out.println(Thread.currentThread().getName()+"执行开始");
// 加锁
syncLock();
// 做业务
doBusiness();
// 计算执行时间
System.out.println(Thread.currentThread().getName()+"执行结束,毫秒:" + (System.currentTimeMillis() - startTime));
}
/**
* 锁类的实例对象
* */
public synchronized void syncLock() throws InterruptedException {
TimeUnit.SECONDS.sleep(5);
System.out.println(Thread.currentThread().getName()+"加锁执行5s");
}
public abstract void doBusiness();
public static void main(String[] args) {
new Thread(()-> {
try {
new SyncSonA().process();
} catch (InterruptedException e) {
System.out.println("异常中断。。。");
}
},"线程SyncSonA:").start();
new Thread(()-> {
try {
new SyncSonB().process();
} catch (InterruptedException e) {
System.out.println("异常中断。。。");
}
},"线程SyncSonB:").start();
}
}
public class SyncSonA extends AbstractSyncFather{
@Override
public void doBusiness() {
try {
TimeUnit.SECONDS.sleep(1);
System.out.println(Thread.currentThread().getName()+"执行逻辑A--1s");
}catch (Exception e){
System.out.println(Thread.currentThread().getName()+"执行逻辑A--异常");
}
}
}
package sync;
import java.util.concurrent.TimeUnit;
public class SyncSonB extends AbstractSyncFather{
@Override
public void doBusiness() {
try {
TimeUnit.SECONDS.sleep(3);
System.out.println(Thread.currentThread().getName()+"执行逻辑B--耗时3s");
}catch (Exception e){
System.out.println(Thread.currentThread().getName()+"执行逻辑B--异常");
}
}
}