iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >synchronized加锁this和class的区别是什么
  • 140
分享到

synchronized加锁this和class的区别是什么

2023-06-21 21:06:30 140人浏览 薄情痞子
摘要

本篇内容介绍了“synchronized加锁this和class的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!synchroni

本篇内容介绍了“synchronized加this和class的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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

synchronized 用法

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

① 修饰普通方法

public synchronized void method() {    // .......}

当 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 个示例,来看二者之间的区别。

1.加锁 class 共享一个类实例

首先,我们创建 5 个线程,调用同一个对象下 synchronized 加锁的 class 代码,具体示例如下:

import java.util.Date;import java.util.concurrent.TimeUnit;public class SynchronizedExample {    public static void main(String[] args) {        // 创建当前类实例        final SynchronizedExample example = new SynchronizedExample();        // 创建 5 个线程执行任务        for (int i = 0; i < 5; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    try {                        // 调用 synchronized 修饰的 class 方法                        example.classMethod();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }).start();        }    }        public void classMethod() throws InterruptedException {        synchronized (SynchronizedExample.class) {            System.out.println(String.fORMat("当前执行线程:%s,执行时间:%s",                    Thread.currentThread().getName(), new Date()));            TimeUnit.SECONDS.sleep(1);        }    }}

以上程序的执行结果如下:

synchronized加锁this和class的区别是什么

从上述结果可以看出,这 5 个线程共享的是同一把锁。

2.加锁 class 创建多个实例

接下来,我们创建 5 个线程,调用不同对象下 synchronized 加锁的 class 代码,具体示例如下:

import java.util.Date;import java.util.concurrent.TimeUnit;public class SynchronizedExample {    public static void main(String[] args) {        // 创建 5 个线程执行任务        for (int i = 0; i < 5; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    try {                        // 创建类实例                        SynchronizedExample example = new SynchronizedExample();                        // 调用 synchronized 修饰的 class 方法                        example.classMethod();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }).start();        }    }            public void classMethod() throws InterruptedException {        synchronized (SynchronizedExample.class) {            System.out.println(String.format("当前执行线程:%s,执行时间:%s",                    Thread.currentThread().getName(), new Date()));            TimeUnit.SECONDS.sleep(1);        }    }}

以上程序的执行结果如下:

synchronized加锁this和class的区别是什么

从上述结果可以看出,虽然是不同的对象,但它们使用的仍然是同一把锁。

3.加锁 this 共享一个类实例

接下来,我们创建 5 个线程,调用 synchronized 加锁 this 的示例。首先我们这 5 个线程调用同一个对象的加锁方法,示例代码如下:

import java.util.Date;import java.util.concurrent.TimeUnit;public class SynchronizedExample {    public static void main(String[] args) {        // 创建当前类实例        final SynchronizedExample example = new SynchronizedExample();        // 创建 5 个线程执行任务        for (int i = 0; i < 5; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    try {                        // 调用 synchronized 修饰的 this 方法                        example.thisMethod();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }).start();        }    }            public void thisMethod() throws InterruptedException {        synchronized (this) {            System.out.println(String.format("当前执行线程:%s,执行时间:%s",                    Thread.currentThread().getName(), new Date()));            TimeUnit.SECONDS.sleep(1);        }    }}

以上程序的执行结果如下:

synchronized加锁this和class的区别是什么

从上述结果可以看出,以上线程使用的都是同一把锁。

4.加锁 this 创建多个类实例

最后一个示例最为特殊,我们使用 synchronized 加锁 this,让这 5 个线程调用各自创建对象的方法,具体示例如下:

import java.util.Date;import java.util.concurrent.TimeUnit;public class SynchronizedExample {    public static void main(String[] args) {        // 创建 5 个线程执行任务        for (int i = 0; i < 5; i++) {            new Thread(new Runnable() {                @Override                public void run() {                    try {                        // 创建(多个)类实例                        SynchronizedExample example = new SynchronizedExample();                        // 调用 synchronized 修饰的 this 方法                        example.thisMethod();                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }).start();        }    }            public void thisMethod() throws InterruptedException {        synchronized (this) {            System.out.println(String.format("当前执行线程:%s,执行时间:%s",                    Thread.currentThread().getName(), new Date()));            TimeUnit.SECONDS.sleep(1);        }    }}

以上程序的执行结果如下:

synchronized加锁this和class的区别是什么

从上述结果可以看出,当使用 synchronized 加锁 this 时,如果线程调用的不是同一个对象,那么这些线程之间使用的锁都是自己独立的锁,这个结果就和 synchronized 加锁 class 的结果完全不同了。

“synchronized加锁this和class的区别是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: synchronized加锁this和class的区别是什么

本文链接: https://www.lsjlt.com/news/300736.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • synchronized加锁this和class的区别是什么
    本篇内容介绍了“synchronized加锁this和class的区别是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!synchroni...
    99+
    2023-06-21
  • 浅谈synchronized加锁this和class的区别
    目录synchronized 用法1.加锁 class 共享一个类实例2.加锁 class 创建多个实例3.加锁 this 共享一个类实例4.加锁 this 创建多个类实例总结syn...
    99+
    2024-04-02
  • volatile和synchronized的区别是什么
    本篇文章给大家分享的是有关volatile和synchronized的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Java 内存模型(JMM)CPU 增加了缓存均衡...
    99+
    2023-06-16
  • Java中Lock和Synchronized的区别是什么
    这篇文章主要讲解了“Java中Lock和Synchronized的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中Lock和Synchronized的区别是什么”吧!1. ...
    99+
    2023-06-30
  • Java常用锁synchronized和ReentrantLock的区别
    目录区别1:用法不同synchronized 基础使用ReentrantLock 基础使用区别2:获取锁和释放锁方式不同区别3:锁类型不同区别4:响应中断不同区别5:底层实现不同小结...
    99+
    2024-04-02
  • Java中volatile和synchronized区别是什么?
    不懂Java中volatile和synchronized区别是什么??其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。volatile是变量修饰符,而synchronized则是作用于一段代...
    99+
    2023-05-31
    java volatile synchronized
  • abstract class和interface的区别是什么
    本文小编为大家详细介绍“abstract class和interface的区别是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“abstract class和interface的区别是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢...
    99+
    2023-06-03
  • react hook和class的区别是什么
    这篇文章主要介绍“react hook和class的区别是什么”,在日常操作中,相信很多人在react hook和class的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • 在java中synchronized和volatile的区别是什么
    java中synchronized和volatile的区别:volatile仅能使用在变量级别,而synchronized则可以使用在变量、方法、和类级别的。synchronized会线程阻塞,volatile不会造成线程阻塞。synchr...
    99+
    2024-04-02
  • Vue.set()和this.$set()的区别是什么
    Vue.set()和this.$set()的区别是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。data () {  return&...
    99+
    2023-06-15
  • Synchronized 与 ReentrantLock 的区别是什么
    这篇文章将为大家详细讲解有关Synchronized 与 ReentrantLock 的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。可重入性:从名字上理解,ReenTrantLo...
    99+
    2023-06-19
  • 在java中synchronized和ReentrantLock区别是什么
    java中synchronized和ReentrantLock区别:synchronized是关键字,而ReentrantLock是类。ReentrantLock比synchronized更灵活。ReentrantLock可以对获取锁的等待...
    99+
    2024-04-02
  • Vuex中this.$store.commit()和this.$store.dispatch()区别是什么
    这篇文章主要讲解了“Vuex中this.$store.commit()和this.$store.dispatch()区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vuex中this...
    99+
    2023-06-29
  • c++中class和struct的区别是什么
    在C++中,class和struct都用于定义自定义的数据类型,但它们之间有几个区别。1. 默认的访问修饰符:在class中,默认的...
    99+
    2023-09-15
    c++
  • java中this和super的区别是什么
    java中this和super的区别是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、We...
    99+
    2023-06-14
  • Java中的this和super区别是什么
    这篇文章主要介绍“Java中的this和super区别是什么”,在日常操作中,相信很多人在Java中的this和super区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中的this和supe...
    99+
    2023-06-25
  • jQuery中this与$(this)的区别是什么
    本篇内容主要讲解“jQuery中this与$(this)的区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jQuery中this与$(this)的区别是...
    99+
    2024-04-02
  • mysql表锁和行锁区别是什么
    小编给大家分享一下mysql表锁和行锁区别是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、表锁特点:偏向MyISAM存储...
    99+
    2024-04-02
  • Class中Extends和Implements属性的区别是什么
    这篇文章给大家介绍Class中Extends和Implements属性的区别是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。<span >var Animal = ne...
    99+
    2024-04-02
  • CSS中id和class之间的区别是什么
    这篇文章给大家分享的是有关CSS中id和class之间的区别是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。   id和class之间的区别   id具有唯一性,clas...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作