【synchronized关键字】

本文探讨了Java中`synchronized`关键字的使用,包括在抽象类中如何实现加锁,以及实例方法、静态方法和代码块的不同应用。通过线程示例展示了synchronized如何确保线程间的同步和互斥,重点讲解了内置锁的原理和实际操作技巧。
摘要由CSDN通过智能技术生成

synchronized的使用

synchronized同步块是Java 提供的一种原子性内置锁,Java中每个对象都可以把他当做一个同步锁来使用,这些Java内置的使用者看不到的锁被称之为内置锁,也叫做监视器锁。

加锁方式

分类具体分类被锁对象伪代码
方法实例方法类的实例对象 public synchronized void method(){
... ...
}
方法静态方法类对象 public static synchronized void method(){
... ...
}
代码块实例对象类的实例对象 synchronized (this){
... ...
}
代码块class对象类对象 synchronized (Demo.class){
... ...
}
代码块任意实例对象Object实例对象ObjectString 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--异常");
        }
    }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值