synchronized 锁的用法

目录

[1. synchronized 实现同步代码块](#1. synchronized 实现同步代码块)

[2. synchronized 同步代码块的特点](#2. synchronized 同步代码块的特点)

[3. synchronized 同步代码块的使用细节](#3. synchronized 同步代码块的使用细节)

[4. synchronized 实现同步方法](#4. synchronized 实现同步方法)

[5. 同步方法的注意事项](#5. 同步方法的注意事项)

[6. StringBuffer类 与 synchronized 的关系](#6. StringBuffer类 与 synchronized 的关系)


1. synchronized 实现同步代码块

在 Java 中,当多个线程共享一个临界资源的时候,就会出现抢夺临界资源的情况,为了保证线程安全的执行,我们就需要做出一些应对措施。syschronized 锁就可以实现同步代码块实现线程安全,我们只需要将临界资源锁起来,让一个线程想要访问该临界资源时,需要先获取到锁才能进行操作,否则就要等待。

同步代码块的格式如下图所示,由 synchronized 和锁对象以及括号内部的代码整体通常就称之为同步代码块;

2. synchronized 同步代码块的特点

(1)没有线程执行代码块时,锁默认是开放的,一旦有一个线程来执行同步代码块,锁自动关闭,其他线程必须阻塞等待;

(2)一个线程在拿到锁执行同步代码块时,只有全部执行完毕线程才会出来,锁会自动释放。

3. synchronized 同步代码块的使用细节

synchronized 的锁对象一定要是唯一的,因为一个线程能不能执行同步代码块,就是要判断该线程是否拥有当前锁对象,如果一个同步代码块的锁对象不是唯一的,有A和B两个锁对象,那么线程1获取到锁对象A去执行同步代码块,线程2获取锁对象B执行同步代码块,就有可能会产生线程冲突,造成线程安全问题。

在实际开发过程中,我们通常可以使用类的字节码文件对象作为锁对象,因为当前类的字节码文件对象就是唯一的。

4. synchronized 实现同步方法

同步方法和同步代码块实现极其相似,同步代码块我们是把一段代码使用 synchronized 锁了起来,而同步方法则同理,它是直接将 synchronized 加在了方法上,与 public,static 等修饰符一并写就可以了,如下所示

5. 同步方法的注意事项

(1)同步方法锁住的是整个方法里面的代码;

(2)同步方法的锁对象是不需要我们自己指定的,Java 已经帮我们指定好了。如果当前同步方法是静态方法,则当前锁对象是当前类的字节码文件对象;如果当前同步方法是非静态方法,则锁对象是 this ,即当前方法的调用者。

6. StringBuffer类 与 synchronized 的关系

我们知道,Java 中的字符串是不可变的,而 StringBuilder 和 StringBuffer 的类对象则是可变的,这两个类的作用几乎完全一样,最大的区别就是 StringBuffer 类中的方法都有 synchronized 锁,如下图所示部分源码

所以,StringBuffer 是线程安全的,而 StringBuilder 是线程不安全的;当我们的程序是多线程时,建议使用 StringBuffer 不使用 StringBuilder,如果是单线程的,使用 StringBuilder 效率更高。

相关推荐
勇闯IT8 分钟前
有多少小于当前数字的数字
java·数据结构·算法
小皮侠1 小时前
【算法篇】逐步理解动态规划模型6(回文串问题)
java·开发语言·算法·动态规划
勤奋的小王同学~1 小时前
(javaSE)抽象类和接口:抽象类概念语法和特性, 抽象类的作用;接口的概念 接口特性 实现多个接口 接口间的继承 Object类
java·开发语言
Ai财富密码1 小时前
【Linux教程】Linux 生存指南:掌握常用命令,避开致命误操作
java·服务器·前端
LUCIAZZZ1 小时前
项目拓展-Jol分析本地对象or缓存的内存占用
java·开发语言·jvm·数据库·缓存·springboot
Elastic 中国社区官方博客1 小时前
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
大数据·开发语言·javascript·elasticsearch·搜索引擎·全文检索·apache
姆路1 小时前
Qt背景平铺
开发语言·qt
GalaxyPokemon2 小时前
LeetCode - 69. x 的平方根
java·数据结构·算法
ningmengjing_2 小时前
js调试技巧
开发语言·javascript·ecmascript
在未来等你2 小时前
设计模式精讲 Day 1:单例模式(Singleton Pattern)
java·设计模式·面向对象·软件架构