Synchronized同步锁

本文探讨了Java中synchronized关键字在非静态和静态方法中的应用,以及其对多线程执行的影响。通过实例展示了不同情况下线程同步的行为,包括线程资源竞争、对象实例锁和类锁的概念。分析了同步锁在方法调用者上的锁定机制,并解释了为何改变方法的静态属性会影响锁资源的获取和释放。最后,提到了创建多个对象实例时如何避免锁资源的争夺。
摘要由CSDN通过智能技术生成

Synchronized同步锁:

非静态方法:锁住方法的调用者
静态方法:锁住当前类
在这里插入图片描述

创建Data类,里面有两个方法,

在这里插入图片描述

创建两个线程,调用data类的方法

在这里插入图片描述

此时的输出:先启动线程A,休眠一秒再启动线程B。B调用的func2直接出结果,A调用的func1等3秒再出结果。程序启动一秒后先输出2… 再过两秒输出1…

在这里插入图片描述

···········································································································

加上synchronized同步锁后,1…和2…再3秒以后同时输出。因为先调用func1方法,线程A会占用锁资源,线程B无法执行,只能等线程A执行完毕后才可以执行,因为fun1有三秒延迟,fun2无延迟,所以会出现等待3秒后同时输出的情况。

在这里插入图片描述
在这里插入图片描述

---------------------------------------------------------------------------------------------------------------------------------------------------
去掉func2的synchronized后,此时先输出2…再输出1… 因为线程B不需要等待线程A释放锁资源,可以直接执行。

在这里插入图片描述

---------------------------------------------------------------------------------------------------------------------------------------------------
当创建两个data对象时,再执行线程AB,此时不会出现争夺锁资源的现象。因为synchronized锁住的是当前方法的调用者,fun1的调用者是data1,func2的调用者是data2,所以不会争夺资源。 此时先输出2…2再输出1…

在这里插入图片描述

---------------------------------------------------------------------------------------------------------------------------------------------------
此时改为静态方法,线程AB,就需要等待锁资源,因为synchronized锁静态方法时,锁的是方法所在的类。

在这里插入图片描述

此时去掉func2的synchronized,也不需要等待资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值