Synchronized 有几种用法
我们都知道 Synchronized 是线程安全同步用的,大部分程序可能只会用到同步方法上面。其实 Synchronized 可以用到更多的场合,栈长列举了以下几个用法。
1、同步普通方法
这个也是我们用得最多的,只要涉及线程安全,上来就给方法来个同步锁。这种方法使用虽然最简单,但是只能作用在单例上面,如果不是单例,同步方法锁将失效。
1 2 3 4 5 6 7 8 9 10 11 | /** * 用在普通方法 */ private synchronized void synchronizedMethod() { System. out .println( "synchronizedMethod" ); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } |
此时,同一个实例只有一个线程能获取锁进入这个方法。
2、同步静态方法
同步静态方法,不管你有多少个类实例,同时只有一个线程能获取锁进入这个方法。
1 2 3 4 5 6 7 8 9 10 11 | /** * 用在静态方法 */ private synchronized static void synchronizedStaticMethod() { System. out .println( "synchronizedStaticMethod" ); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } |
同步静态方法是类级别的锁,一旦任何一个线程进入这个方法,其他所有线程将无法访问这个类的任何同步类锁的方法。
3、同步类
下面提供了两种同步类的方法,锁住效果和同步静态方法一样,都是类级别的锁,同时只有一个线程能访问带有同步类锁的方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | /** * 用在类 */ private void synchronizedClass() { synchronized (TestSynchronized. class ) { System. out .println( "synchronizedClass" ); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 用在类 */ private void synchronizedGetClass() { synchronized ( this .getClass()) { System. out .println( "synchronizedGetClass" ); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } |
这里的两种用法是同步块的用法,这里表示只有获取到这个类锁才能进入这个代码块。
4、同步this实例
这也是同步块的用法,表示锁住整个当前对象实例,只有获取到这个实例的锁才能进入这个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * 用在this */ private void synchronizedThis() { synchronized ( this ) { System. out .println( "synchronizedThis" ); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } |
用法和同步普通方法锁一样,都是锁住整个当前实例。
5、同步对象实例
这也是同步块的用法,和上面的锁住当前实例一样,这里表示锁住整个 LOCK 对象实例,只有获取到这个 LOCK 实例的锁才能进入这个方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * 用在对象 */ private void synchronizedInstance() { synchronized (LOCK) { System. out .println( "synchronizedInstance" ); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } } |
另外,类锁与实例锁不相互阻塞,但相同的类锁,相同的当前实例锁,相同的对象锁会相互阻塞。
关于 Synchronized 的几种用法栈长就介绍到这里了,如果你还知道其他的用法,欢迎留言。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2018-06-27 特色博客
2018-06-27 Linux上的free命令简介
2018-06-27 在 Java 8 中获取日期
2018-06-27 Mac 终端Terminal光标移动快捷键
2018-06-27 使用 AWK 來做垂直数字相加