前言

我们一般对共享数据操作的时候,为了达到线程安全我们会使用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修饰代码块时,使用的是类锁的话,那就很简单了,唯一的类锁,和修饰静态方法一样。

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

最新文章

  1. Linux时间同步
  2. e.preventDefault() e.stopPropagation()和return false的区别
  3. VisualStudio配色方案
  4. Python学习笔记(五)——list和tuple
  5. java链式编程设计
  6. LightOj1007 - Mathematically Hard(欧拉函数)
  7. 一个基于atomic的卖票测试
  8. laravel项目return back()->withErrors($validator)或return back()->with('errors','原密码错误!')在前台原密码错误的情况下不能正确显示错误信息,变成报错!
  9. 如何设计App登录模块?
  10. android150 笔记
  11. 初学Node.js第一天
  12. AWS之EC2远程登录
  13. C++中指针和引用的选择
  14. INTRODUCE OF REPRESENTATIVE CPG-CONTROLLED ROBOTS
  15. settings设置中文admin
  16. CSS定位方法
  17. push到Git时常见的失败
  18. Http TCP/IP协议和socket之间的区别和联系
  19. day26 python学习 对象的接口,封装,私用属性 property
  20. 关于Cocos2d-x事件处理机制

热门文章

  1. 暑假自学java第十一天
  2. 如何快速实现一个虚拟 DOM 系统
  3. Springboot:单元测试日志打印@Slf4j 注解的使用方法
  4. pdm文件name与comment互相同步
  5. Linux文件目录结构详解 (转)
  6. PHP观察者模式 (转)
  7. MySQL基础篇(一)
  8. 洛谷P5463 小鱼比可爱(加强版) 题解
  9. C语言:char[]操作
  10. 双线性插值算法的FPGA实现