今天看了很多关于synchronized的博客,全部都是模棱两可很多都是抄的,上下不接的,很烦啊,去看看视频和实验一下,做个简单的记录,面试备用.
重点看一下: synchronized是同步锁,他所有修饰都是同步的.
作用的范围:synchronized所影响的一个或多个方法
作用的对象:synchronized所影响的一个或多个类
第一种 修饰一个代码块
synchronized(obj)
{
//逻辑
}
这是同步代码块
- 作用的范围:是大括号{}括起来的代码
- 作用的对象:是调用这个代码块的对象
第二种 修饰一个非静态方法
public synchronized void test1()
{
//逻辑
}
底层synchronized 作用在对象上
- 作用的范围:整个方法
- 作用的对象:调用这个方法的对象
- 解释:也就是说调用这个方法的对象,如果里面有很多被synchronized 修饰方法情况下,
有一个被调用其他的都得等着(但是不包含synchronized 静态方法).
第三种 修饰一个静态方法
public static synchronized void test1()
{
//逻辑
}
底层synchronized 作用在类上
- 作用的范围:整个静态方法
- 作用的对象:这个类的所有对象
- 解释:此类所有对象(被new出了好几个对象)有多个被synchronized 修饰静态方法情况下,
只要是有一个对象中一个静态方法被占用,其他所有对象中所有静态方法都得等着(但是不包含synchronized 普通方法).
第四种 修饰一个类
- 作用的范围:synchronized后面括号括起来的部分
- 作用的对象:这个类的所有对象
- 解释:没啥说的,就是一个类都锁了,不管什么方法,不管几个对象,一个吊用,其他都锁.
补充:修饰非静与修饰静,
-
修饰非静:这个就是对象锁(一个对象中有两个方法同时被synchronized,调用这两个方法时,只能同时执行一个。但它并不能使调用该方法的多个对象在执行顺序上互斥,就是多个对象调用这个方法它就没办法保证数据是不是出现同时被使用脏读这些问题,不知道描述精准吗,请大佬指正)
-
修饰静:这个就是类锁了,一锁锁一个类的所有对象.
-
修饰非静与修饰静,出现在同一个对象中他们不是一个锁, 各走各的,相互不影响.

本文详细解析了synchronized关键字在Java中的四种使用方式及其作用范围和对象,包括代码块、非静态方法、静态方法及类级别,并对比了其与ReentrantLock的性能与使用场景。
1020

被折叠的 条评论
为什么被折叠?



