synchronized 加锁 this 和 class 的区别!(1)

简介: synchronized 加锁 this 和 class 的区别!(1)

synchronized 是 Java 语言中处理并发问题的一种常用手段,它也被我们亲切的称之为“Java 内置锁”,由此可见其地位之高。然而 synchronized 却有着多种用法,当它修饰不同对象时,其意义也是不同的,下面我们一起来看。


synchronized 用法


synchronized 可以用来修饰普通方法、静态方法和代码块


① 修饰普通方法


/**
 * synchronized 修饰普通方法
 */
public synchronized void method() {
    // .......
}


当 synchronized 修饰普通方法时,被修饰的方法被称为同步方法,其作用范围是整个方法,作用的对象是调用这个方法的对象。


② 修饰静态方法


/**
 * synchronized 修饰静态方法
 */
public static synchronized void staticMethod() {
    // .......
}


当 synchronized 修饰静态的方法时,其作用的范围是整个方法,作用对象是调用这个类的所有对象。


③ 修饰代码块


为了减少锁的粒度,我们可以选择在一个方法中的某个部分使用 synchronized 来修饰(一段代码块),从而实现对一个方法中的部分代码进行加锁,实现代码如下:


public void classMethod() throws InterruptedException {
    // 前置代码...
    // 加锁代码
    synchronized (SynchronizedExample.class) {
        // ......
    }
    // 后置代码...
}


以上代码在执行时,被修饰的代码块称为同步语句块,其作用范围是大括号“{}”括起来的代码块,作用的对象是调用这个代码块的对象。


但以上代码,除了可以加锁 class 之外,还可以加锁 this,具体示例如下:


public void classMethod() throws InterruptedException {
    // 前置处理代码...
    synchronized (this) {
        // ......
    }
    // 后置处理代码...
}


那问题来了,使用 synchronized 加锁 this 和 class 的区别是什么?不都是加锁同一个类吗?


答案还真不是,加锁 this 和 class 区别还是很大的。下面我们通过以下 4 个示例,来看二者之间的区别。

相关文章
|
6月前
|
安全 Java
Synchronized和Lock的区别
Synchronized和Lock的区别
67 0
|
3月前
|
存储 Java 程序员
synchronized的原理以及与ReentrantLock的区别
`synchronized`和`ReentrantLock`均为Java线程同步机制,确保共享资源的单一时刻独占访问。`synchronized`关键字直接嵌入JVM,可通过修饰方法或代码块实现对象锁或监视器锁,具备可重入性,依赖Mark Word进行锁状态管理。`ReentrantLock`则需显式调用`lock()`和`unlock()`,提供更灵活控制,如公平锁、尝试锁及条件变量。两者在语法、灵活性和异常处理上有所差异,但均支持可重入性。性能方面,随JDK优化,`synchronized`在某些场景下甚至优于`ReentrantLock`。选择使用哪个取决于具体需求和上下文。
|
Java
synchronized和lock的区别
synchronized和lock的区别
88 0
|
6月前
synchronized与ReentrantLock区别与联系
synchronized与ReentrantLock区别与联系
41 0
|
Java
Lock 和 Synchronized的区别?
本章主要讲解了Lock 和 Synchronized的区别和知识点
54 0
|
Java
synchronized和Lock的区别
synchronized和Lock的区别
71 0
synchronized(this)、synchronized(class)和synchronized(Object)的区别
synchronized(this)、synchronized(class)和synchronized(Object)的区别
125 0
synchronized(this)、synchronized(class)和synchronized(Object)的区别
|
前端开发 Java Spring
方法上加上 synchronized 就可以了么
方法上加上 synchronized 就可以了么
|
安全 Java
Lock和Synchronized的区别
Lock和Synchronized的区别
Lock和Synchronized的区别
|
Java
JAVA同步锁 synchronized(this)、synchronized(class)与synchronized(Object)的区别
利用实例介绍JAVA同步锁 synchronized(this)、synchronized(class)与synchronized(Object)的区别
142 0
JAVA同步锁 synchronized(this)、synchronized(class)与synchronized(Object)的区别