【好记性不如烂笔头】synchronized是怎么做到同步的?使用场景是什么?简述下原理。


前言

  synchronized是Java的一种关键字,大家都知道这个关键字可以对对象、方法、代码块加锁,但synchronized究竟是如何做到的呢?

一、synchronized简介

  百度百科对此的解释是:Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时,另一个线程仍可以访问该object中的非加锁代码块。
  可能上面的话有点绕口不好记,下面我画个图说明下:
synchronized简介


二、synchronized使用方法

  先给出结论,然后再给出说明:

  • 作用对象
    • 修饰方法
    • 修饰代码块
  • 作用类
    • 修饰静态方法
    • 修饰类

  结论从哪里来的呢?从官网描述的来的Chapter 8. Classes (oracle.com)
在这里插入图片描述
  从官网的描述来看,作用其实就两种,一种作用于类,一种坐于用方法(调用方法的对象this),但是这是Java编译后的结果,我们实际使用中可以分为四种,修饰方法、修饰代码块、修饰静态方法、修饰类,只不过Java编译后运行只分两种。

三、synchronized实现原理

  其实官网这里也描述了,使用了monitor……这还真是一层套一层啊,monitor是什么?这里就不深究了,简单的介绍下:monitor是操作系统提供的一种管理自己的变量以及访问这些变量的过程的软件工具或者说是高级原语,还是拿自动售票机举个例子,自动售票机同一时刻只允许一个身份证进行操作。那么这个自动售票机就可以理解是个monitor

  • 多个进程对于monitor的同时访问是互斥的;
  • 但是不同时访问又都可以访问是共享的;
  • 而且身份证是个特殊的物品,是有权限访问的物品,所以monitor又可以理解为只允许自己管理的进程访问,其他进程不能直接访问是安全的;
  • 数据能不能拿出来随便用,也不行,进程需要进来才能访问我的变量数据,数据是私有的;

在这里插入图片描述

  可能有小伙伴说monitor是操作系统的,跟Java有啥关系,这个我没有了解过Java不同版本究竟是获得了操作系统的支持,还是自己实现了再用,不过根据JVM的描述,我觉得Java应该是自己实现了monitor的,如果我描述的不准确也欢迎各位小伙伴指正。

在这里插入图片描述
在这里插入图片描述

总结

synchronized是Java的关键字,作用就是对指定的对象或类加锁,使对其进行同步操作;
synchronized作用两类:对象、类;
synchronized使用方式:修饰方法、修饰代码块、修饰静态方法、修饰类;
synchronized基于monitor实现了对对象或类的锁定。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

泪梦殇雨

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

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

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

打赏作者

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

抵扣说明:

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

余额充值