浅谈synchronized

前言

看多线程的相关书籍的时候,会经常阅读到一个使用前景,就是银行的取钱存钱操作。

假设我们使用两个线程来模拟取钱操作,模拟两个人使用同一个账户并发取钱的问题,我们都知道存款不可能为负的,

但是往往并发操作的时候,可能就会导致系统出错导致出现负的数字(假设一开始都是200元余额,两边同时操作取出150,系统可能就会出错)。

出现类似这种问题就是缺少同步安全性,为了解决这个问题,Java就增进了同步监视器来解决这个,也就是本文讲的synchronized的作用。

是什么

synchronized是Java中的关键字。同步的意思,用在解决线程安全问题上。有添加在方法上,和直接修饰代码块。有种保护的作用,使用修饰之后,家门上了锁,别人进不来。用synchronized修饰的方法只允许一个线程执行,其他线程无法进入该方法。(原子性操作),银行使用该操作之后,就会变成一个排队操作一样,像前言的例子,就会变成一个人等另一个操作取出150之后才可以取钱,这样就不会出现负的余额。

  1. 基本上所有的并发模式 在解决线程冲突的时候,都是采用序列化访问共享资源的方案。就是在给定的时间间隔内只允许一个任务访问共享资源。
所以synchronized保护的是线程遭受破坏,必须按照允许的权限进行资源访问。

记得synchronized关键字可以修饰方法,可以修饰代码块,但不能修饰构造函数、属性等。

//long与double的操作不是原子的

格式

同步代码块

//synchronized代码块
//obj对象即表示线程开始执行同步代码块之前,必须先获得对同步监视器的锁定
//步骤:加锁--修改--释放锁
synchronized (obj) {
...
}

任何时刻只能有一个线程可以获得对同步监视器的锁定,当同步代码块执行完成后,该线程会释放对该同步监视器的锁定。具体的格式参见上面。

同步方法

//synchronized方法,可以分为静态方法和普通方法
synchronized void method(){
...
}
//等价于
public void method()
{
synchronized(this) {
// todo
}
}
//无论哪种形式都可以看做是“{”处获取锁,“}”释放锁

与同步代码块对应,Java 的多线程安全支持还提供了同步方法,同步方法就是使用synchronized关键字来修饰某个方法(放在权限词的后面即可),则该方法称为同步方法。对于同步方法而言,无须显式指定同步监视器,同步方法的同步监视器是this,也就是该对象本身。在格式上可以看到一些用法,但是具体来讲,synchronized用在方法体上还分为用在普通方法和静态方法两种,区别在作用锁对象的不同。

修饰普通方法作用的是调用这个方法的对象,修饰静态方法作用是调用这个类的所有对象。
synchronized static方法可以在类的范围内防止对static数据的并发访问,

使用同步方法可以很方便得实现线程安全的类,这样类的对象可以被多个线程同时安全得访问。

注意

  1. synchronized不能被继承。
  2. collection中的线程不安全的集合可以变成使用Collections工具类的,具体用法语句可以参考API文档,写的还算比较详细。

最后

  1. 关于什么使用同步,也就是上锁,引用书上的话

    如果你在写一个变量,它可能接下来将被另一个线程读取,或者正在读取上一个已经被另一个线程写过的变量,那么你必须使用同步,并且,读取线程都必须用相同的监视器锁同步

    ​ ——Brain Goetz《Java Concurrency in Pactice》的作者

  2. 个人学习记录,有错误欢迎指点,谢谢!加油!

浅谈synchronized的更多相关文章

  1. Java多线程编程(四)—浅谈synchronized与lock

    一.共享资源竞争问题 在Java语言的并发编程中,由于我们不知道线程实际上在何时运行,所以在实际多线程编程中,如果两个线程访问相同的资源,那么由于线程运行的不确定性便会在这种多线程中产生访问错误.所以 ...

  2. 浅谈synchronized和volatitle实现线程安全的策略

    什么是线程不安全 我对线程安全的理解就是多个线程同时操作一个共享变量时会产生意料之外的情况,这种情况就是线程不安全.注意:只有写操作才可能出现线程不安全,对共享变量只进行读操作线程是绝对安全的. 具体 ...

  3. 对kotlin和java中的synchronized的浅谈

    synchronized在java中是一个关键字,但是在kotlin中是一个内联函数.假如分别在java和kotlin代码锁住同一个对象,会发生什么呢,今天写了代码试了试.首先定义people类 12 ...

  4. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  5. 谁还没遇上过NoClassDefFoundError咋地——浅谈字节码生成与热部署

    谁还没遇上过NoClassDefFoundError咋地--浅谈字节码生成与热部署 前言 在Java程序员的世界里,NoClassDefFoundError是一类相当令人厌恶的错误,因为这类错误通常非 ...

  6. 浅谈Java线程安全

    浅谈Java线程安全 - - 2019-04-25    17:37:28 线程安全 Java中的线程安全 按照线程安全的安全程序由强至弱来排序,我们可以将Java语言中各种操作共享的数据分为以下五类 ...

  7. Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理

    Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理 转自:https://www.jianshu.com/p/2b71ea919d49 本系列文章首发于我的个人博 ...

  8. 浅谈iOS多线程

    浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...

  9. 浅谈SpringBoot核心注解原理

    SpringBoot核心注解原理 今天跟大家来探讨下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot为什么不需要XML,达到零配置 ...

随机推荐

  1. java面试-反射

    1.什么是反射?有什么优缺点?   反射就是动态加载对象,并对对象进行剖析.在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法.对于任意一个对象,都能够调用它的任意一个方法.这种动态获取信 ...

  2. Java高级特性——流

    以上就是这段时间学习完流的知识以后我的总结,.mmap文件可以去我的github上获取:https://github.com/xiaozhengyu/StudyNotes.git

  3. 「HDU3823」 Prime Friend 解题报告

    Prime Friend Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. 1089 狼人杀-简单版 (20 分)C语言

    以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人杀"游戏中,1 号玩家说:"2 号是狼人" ...

  5. shiro采坑指南—基础概念与实战

    说明   代码及部分相关资料根据慕课网Mark老师的视频进行整理.   其他资料: shiro官网 基础概念 Authenticate/Authentication(认证)   认证是指检查用户身份合 ...

  6. 关于AWD线下攻防的经验

    备份:     1.备份源码,使用图像化工具连接ssh后,我喜欢用winscp,         找到根目录后,直接右键后台下载就行.           找根目录这里,有时候比赛不给根目录位置,上次 ...

  7. 扫描器是如何判定有xss漏洞的

    这个问题,看似简单,实则触及到很多人的知识盲区 我们都知道,弹窗就能判定这个页面存在xss, 那么扫描器是怎么判断的呢,或者说扫描器是怎么判断是否弹窗的呢 测试发现 当响应的头中content-typ ...

  8. Netty 的基本简单实例【服务端-客户端通信】

    Netty是建立在NIO基础之上,Netty在NIO之上又提供了更高层次的抽象. 在Netty里面,Accept连接可以使用单独的线程池去处理,读写操作又是另外的线程池来处理. Accept连接和读写 ...

  9. [JavaScript设计模式] 什么是单例模式

    概念 保证一个类仅有一个实例,并提供一个全局访问点 为什么要用单例模式 想象一下某些web应用,当点击登录按钮时,会弹出一个登录框,无论你点击多少次这个登录按钮,登录框都只会出现一个,不会出现多个登录 ...

  10. Lua表(table)的个人总结

    1.表的简介和构造 table是个很强大且神奇的东西,又可以作为数组和字典,又可以当作对象,设置module.它是由数组和哈希表结合的实现的.他的key可以是除nil以外任意类型的值,key为整数时, ...