前言

我们一般对共享数据操作的时候,为了达到线程安全我们会使用synchronized关键字去修饰方法或者代码块。那么今天我们就来讲一讲synchronized关键字的使用。

专栏推荐:

并发编程专栏

synchronized的使用

synchronized的使用可以修饰代码块,也可以修饰对象方法,以及静态方法。不过这些修饰的本质实质就只是锁的资源不同,一种是对象,一种是类。

修饰代码块

错误代码:this,对象锁



当我们使用不同实例对象去调用方法的时候会发现结果并不是我们想象的20000,因为this这个指代的是当前对象,因为是两个不同的对象,所以使用this是锁不住的。

看一下执行结果:

只有使用相同的对象的时候,才可以。所以不推荐使用this,而是使用固定的对象去作为锁,才能够锁住。

相同实例对象的执行结果:

下面我们使用一个初始化好的一个实例对象作为对象锁。(useSynchronized)

使用不同的对象去调用也没有问题,因为对象锁是初始化好的一个实例对象useSynchronized作为对象锁

执行结果正确:

修饰对象方法

[图片上传中...(对象方法main.png-d41e8a-1628781214368-0)]

修饰对象方法,这个就和代码块中使用对象锁一样,因为synchronized修饰在对象方法上,所以它实质是等于代码块中使用this,因为一个类可以有很多实例对象,所以这个是锁不住的。

执行结果有问题,未能锁住:

修饰静态方法

修饰静态方法,这个就和代码块中使用类锁一样,因为synchronized修饰在静态方法上,所以它实质是等于代码块中使用当前这个类的class,不管你一个类有多少个实例对象,你只有一个class,类锁是唯一的就不会出现多线程同时执行方法的现象。

执行结果,和我们预想的一样20000:

总结一下:

1、synchronized修饰对象方法,如果是不同的对象调用这个方法,是不能启动任何控制作用的。synchronized修饰代码块时,如果锁资源使用的是this,那么就和synchronized修饰对象方法一样,因为一个类可以有多个实例对象,每个实例对象都不一样,就相当于一个门,有多个钥匙,谁都可以进入。所以我们使用synchronized修饰代码块时,我们需要声明一个唯一的钥匙,比如我们上面的代码,先创建一个静态的实例对象,使用它当作这个门的唯一钥匙,就可以保证多个线程,不会同时进入方法内执行。

2、synchronized修饰静态方法,就比较简单了,我们直接使用某一个类的class,它就可以实现一个唯一性,不管是这个类的多少个实例对象,这些对象对应的class只有一个。所以是可以实现多线程操作共享资源,不会有问题。那么当我们synchronized修饰代码块时,使用的是类锁的话,那就很简单了,唯一的类锁,和修饰静态方法一样。

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞关注。

并发编程——synchronized关键字的使用的更多相关文章

  1. 并发编程-synchronized关键字大总结

    0.synchronized 的特点: 可以保证代码的原子性和可见性. 1.synchronized 的性质: 可重入(可以避免死锁.单个线程可以重复拿到某个锁,锁的粒度是线程而不是调用).不可中断( ...

  2. 5.并发编程-synchronized 细节说明

    并发编程-synchronized 细节说明 1. synchronized-锁重入 & 异常释放锁 说明 * 关键字synchronized 拥有锁重入的功能,也就是在使用synchroni ...

  3. 并发编程之关键字(synchronized、volatile)

    并发编程主要设计两个关键字:一个是synchronized,另一个是volatile.下面主要讲解这两个关键字,并对这两个关机进行比较. synchronized synchronized是通过JMV ...

  4. 多线程与高并发(三)synchronized关键字

    上一篇中学习了线程安全相关的知识,知道了线程安全问题主要来自JMM的设计,集中在主内存和线程的工作内存而导致的内存可见性问题,及重排序导致的问题.上一篇也提到共享数据会出现可见性和竞争现象,如果多线程 ...

  5. Java并发编程-synchronized

    多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题.同步机制可以使用synchronized关键字实现.synchronized关 ...

  6. Java并发编程 Volatile关键字解析

    volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...

  7. Java并发编程-synchronized指南

    在多线程程序中,同步修饰符用来控制对临界区代码的访问.其中一种方式是用synchronized关键字来保证代码的线程安全性.在Java中,synchronized修饰的代码块或方法不会被多个线程并发访 ...

  8. Java并发编程volatile关键字

    volatile理解 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和volatile 关键字机制.volatile具有synchronized关键字的“可见性”,vo ...

  9. java并发编程--Synchronized的理解

    synchronized实现锁的基础:Java中每一个对象都可以作为锁,具体表现为3种形式. (1)普通同步方法,锁是当前实例对象 (2)静态同步方法,锁是当前类的Class对象 (3)同步方法块,锁 ...

随机推荐

  1. 关于Android Studio Emulator常见使用问题

    Q:模拟器无法初始化声音相关设备 Emulator: dsound: Could not initialize DirectSoundCapture Emulator: dsound: Reason: ...

  2. 日常BUG-01 之 @Sl4j

    问题描述: 需要打印日志,使用的是lombok包中的sl4j,lombok依赖如下: <dependency> <groupId>org.projectlombok</g ...

  3. Harbor镜像仓库

    Harbor镜像仓库 作者 刘畅 时间 2020-7-11 微信 目录 1.下载离线安装包 1 2.安装docker 1 3.安装docker-compose 2 4.自签TLS证书 2 4.1.创建 ...

  4. GDI+中发生一般性错误的解决办法(转载)

    今天在开发.net引用程序中,需要System.Drawing.Image.Save 创建图片,debug的时候程序一切正常,可是发布到IIS后缺提示出现"GDI+中发生一般性错误" ...

  5. ThreadLocal底层原理学习

    1. 是什么? 首先ThreadLocal类是一个线程数据绑定类, 有点类似于HashMap<Thread, 你的数据> (但实际上并非如此), 它所有线程共享, 但读取其中数据时又只能是 ...

  6. XCTF getit

    一.查壳 是linux的文件.没加壳 二.拖入ida 分析一下逻辑,发现就是t的值就是flag. 写个exp就出来了. 三.exp分享 s='c61b68366edeb7bdce3c6820314b7 ...

  7. XCTF reverse_box(idapython)

    ida先静态分析,发现有很多a2[1]不知道是什么,就远程动调了一下,发现是我们所输入的字符串,也就是我们所输入的字符串作为索引,通过v4这个数组输出,这题题目的数据漏给了,当时也是一头雾水,后面找了 ...

  8. WPF DataGrid RowDetailsTemplate 鼠标滚动通知到 DataGrid 滚动

    前言:上次做了数据驱动UI虽然已经实现,但是在明细中鼠标滚动并不能带动外部 DataGrid 滚动条滚动,上文地址  https://www.cnblogs.com/luguangguang/p/14 ...

  9. Pytest学习笔记11-重复执行用例插件pytest-repeat

    前言 我们在平时做测试的时候,经常会遇到一些偶现的bug,通常我们会多次执行来复现此类bug,那么在自动化测试的时候,如何多次运行某个或某些用例呢,我们可以使用pytest-repeat这个插件来帮助 ...

  10. Asp.net mvc使用SignaIR

    一.Asp.net SignalR 是个什么东东 Asp.net SignalR是微软为实现实时通信的一个类库.一般情况下,SignalR会使用JavaScript的长轮询(long polling) ...