java锁的到底是锁的什么??

锁住的内容

锁代码块

对多个线程使用的多个此类A的代码加锁,即使多个线程多个对象也 会只有一个线程进入到此代码块,与对象个数,线程个数无关。

实现方式

(1)类代码块  public  void a(){ synchronized(A.class){} }

(2)静态lock对象 static  Lock lock=new ReetrantLock();

(3)静态方法  public synchronized  static void xx(){}

锁对象

对多个线程使用的同一个类A对象加锁,与线程个数无关,多个线程中必须使用同一个类A对象,才会同步线程。

实现方式

(1)对象代码块 public  void a() synchronized(this){} }

(2)非静态方法 public synchronized  void xx(){}

(3) 非静态lock对象 Lock lock=new ReetrantLock()

Synchronized 锁

1、synchronized加在非静态方法前和synchronized(this)都是锁住了这

### Java 同步概念 Java 中的 `synchronized` 关键字用于提供一种机制来确保多个线程不会同时执行某个特定代码段,从而防止数据竞争和其他并发问题。通过使用同步,可以控制对共享资源的访问,使得每次只有一个线程能够操作这些资源。 #### 对象与类 - **对象**:当一个线程获取到某对象的对象之后,其他任何试图获取同一对象的操作都将被阻塞直到当前持有的线程释放它[^1]。 - **类**:对于静态方法或者以 Class 类型作为参数的方法来说,则是对整个类加而不是实例化后的对象;这意味着即使存在多个不同实例的情况下也只会有一个线程能进入临界区[^2]。 #### 内置的工作原理 每个 Java 对象都关联着一把内置(intrinsic lock),这把由 JVM 自动管理。当一个线程想要执行一段受此保护的同步代码块或方法时,必须先获得相应的。一旦获得了并进入了这段区域,在离开之前该线程一直保持着对该的所有权,并且在此期间不允许其它线程再次取得相同的[^3]。 ```java public class Counter { private int count; public synchronized void increment() { // 方法级别的定 this.count++; } public static synchronized void reset(Counter counter) { // 静态方法级别定 counter.count = 0; } } ``` 上述例子展示了两种不同的方式来应用 `synchronized` 定: - 使用关键字修饰成员函数表示对调用者所属对象上施加独占性的限制; - 如果是静态成员函数则意味着在整个类范围内实施互斥约束。 #### 四种常见的 `synchronized` 应用场景 1. **普通同步方法**:直接在非静态成员函数前加上 `synchronized` 来定义,此时所使用的即为当前实例(`this`)上的。 2. **私有同步方法**:同样适用于非静态成员函数,区别在于其可见性更窄一些而已。 3. **静态同步方法**:应用于静态上下文中,这里涉及的是针对整个类而非单个对象的全局级别的定行为。 4. **同步代码块**:允许开发者指定要定的具体表达式,通常是一个显式的对象引用,这样做的好处是可以更加精细地控制哪些部分应该受到保护以及减少不必要的等待时间。 ```java // 同步代码块的例子 public void someMethod(Object obj){ synchronized(obj){ // 只有拥有obj这个对象监视器的线程才能进入此处 ... } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

life1024

你的鼓励将是我创作的最大动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值