【JavaEE】synchronized关键字

synchronized 是 Java 原生隐式锁,兼具原子性、可见性与有序性。作为并发编程基础工具,其无需手动管理锁生命周期,为多线程共享资源安全访问提供简洁可靠的同步保障。

1.synchronized的写法

  • 写法一:
Java 复制代码
synchronized (/*对象名*/){ // 进这个{ 程序就自动上锁了
	// 执行的逻辑内容
}// 程序走到这,就会自动解锁
  • 写法二:
Java 复制代码
synchronized public static void add() { // 修饰方法名
    count++;
}

2. synchronized的特性

  1. 互斥

这个是synchronized的基本特性,多个线程遇到synchronized的时候,如果是同一个对象上的锁的话,那么就会阻塞等待前一个线程结束。

Java 复制代码
Object locker = new Object();

Thread t1 = new Thread(()->{
    synchronized (locker){
        for (int i = 0; i < 50000; i++) {
            count++;
        }
    }
});
Thread t2 = new Thread(()->{
    synchronized (locker){
        for (int i = 0; i < 50000; i++) {
            count++;
        }
    }
});
  1. 可重入

synchronized同步块对同一条线程来说是可以重入的,不会出现自己锁自己的情况

Java 复制代码
synchronized (locker){
    synchronized (locker){
        for (int i = 0; i < 50000; i++) {
            count++;
        }
    }
}

注: 正常来说这个代码的执行是这样的,外面那个synchronized把线程锁住了,这种情况叫做死锁,随后里面那个synchronized被阻塞等待了,但是大佬们早就想到这个了,所以在Java中就给synchronized整了个可重入的特性,这里只是针对了一个线程一把锁,有可重入锁来解决这个。

但是真正上锁和解锁都是最外围的那个synchronized来进行的

3. 如何自己手搓一个可重入锁

  1. 在所内部记录当前是哪个对象持有这个锁,后续加锁时,都进行判断,是否是同一个对象锁持有的锁。
  2. 通过计数器来,判断哪个才是真正解锁的}。
相关推荐
学长毕设3 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw4 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
源码集结号5 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场5 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
啃瓜子的松鼠6 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David7 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放7 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友
用户3721574261357 小时前
Java 操作 Word 脚注和尾注:添加、读取与删除
java
小嘉丶学长8 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节