线程同步 线程安全

您知道什么是线程安全吗? 如果没有,下面是一个简单的示例。 所有类都必须是线程安全的,对吗? 并不是的。 其中一些必须是线程安全的? 又错了。 我认为它们都不必是线程安全的,而它们都必须提供同步的装饰器。

阿拉丁(1992),罗恩·克莱门茨和约翰·马斯克

让我们从一个示例开始(顺便说一下,它是mutable ):

class Position {private int number = 0;@Overridepublic void increment() {int before = this.number;int after = before + 1;this.number = after;}
}

您如何看待-它是线程安全的吗? 该术语指的是当同时由多个线程使用时,此类的对象是否将正确运行。 假设我们有两个线程在同一个对象position ,并在完全相同的时刻调用其方法increment()

我们期望两个线程结束时整数的number等于2,因为它们每个都会递增一次,对吗? 但是,这极有可能不会发生。

让我们看看会发生什么。 在两个线程中,启动时, before等于0 。 然后after将设置为1 。 然后,两个线程会做this.number = 1 ,我们将结束与1number ,而不是预期2 。 看到问题了吗? 在设计中存在此类缺陷的类不是线程安全的

最简单,最明显的解决方案是使我们的方法synchronized 。 这样可以保证无论有多少线程同时调用它,它们都会按顺序而不是并行进行:一个线程接一个线程。 当然,这将花费更长的时间,但是它将防止该错误的发生:

class Position {private int number = 0;@Overridepublic synchronized void increment() {int before = this.number;int after = before + 1;this.number = after;}
}

保证无论有多少线程都不会中断的类称为线程安全

现在的问题是:我们是否必须使所有类都成为线程安全的,或者只使其中某些类成为线程安全的? 使所有类都无错误似乎更好,对吗? 为什么有人想要一个可能在某个时候破裂的物体? 好吧,不完全是。 请记住,涉及性能问题; 我们通常没有多个线程,并且我们始终希望我们的对象尽可能快地运行。 线程间同步机制肯定会使我们慢下来。

我认为正确的方法是开设两个班级。 第一个不是线程安全的,而另一个是同步的decorator ,它看起来像这样:

class SyncPosition implements Position {private final Position origin;SyncPosition(Position pos) {this.origin = pos;}@Overridepublic synchronized void increment() {this.origin.increment();}
}

现在,当我们需要position对象是线程安全的时,我们可以使用SyncPosition装饰它:

Position position = new SyncPosition(new SimplePosition()
);

当我们需要一个简单的简单位置而没有任何线程安全性时,我们可以这样做:

Position position = new SimplePosition();

我认为使类功能既丰富线程安全是违反了那个著名的单一责任原则的 。

顺便说一句,这个问题非常接近防御性编程和验证程序之一。

您可能还会发现这些相关的帖子有趣: 您如何使用InterruptedException? ; 为什么InputStream设计错误 ; 限制Java方法执行时间 ; 如何实现一个迭代适配器 ; 通过验证装饰器进行防御性编程 ;

翻译自: https://www.javacodegeeks.com/2017/01/synchronized-decorators-replace-thread-safe-classes.html

线程同步 线程安全

线程同步 线程安全_同步装饰器来替换线程安全类相关推荐

  1. 同步装饰器来替换线程安全类

    您知道什么是线程安全吗? 如果没有,下面是一个简单的示例. 所有类都必须是线程安全的,对吗? 并不是的. 其中一些必须是线程安全的? 又错了. 我认为它们都不必是线程安全的,而它们都必须提供同步的装饰 ...

  2. python多线程实现同步的方式_深入解析Python中的线程同步方法

    同步访问共享资源 在使用线程的时候,一个很重要的问题是要避免多个线程对同一变量或其它资源的访问冲突.一旦你稍不留神,重叠访问.在多个线程中修改(共享资源)等这些操作会导致各种各样的问题:更严重的是,这 ...

  3. python线程安全的计数器_+ =运算符在Python中是线程安全的吗?

    + =运算符在Python中是线程安全的吗? 我想为实验创建一个非线程安全的代码块,这些是2个线程将要调用的函数. c = 0 def increment(): c += 1 def decremen ...

  4. java同步异步区别_同步请求和异步请求的区别

    同步请求和异步请求的区别 先解释一下同步和异步的概念 同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式. 异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的 ...

  5. Python 进阶_闭包 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  6. 改变数据类型的装饰器_用装饰器改变收藏

    改变数据类型的装饰器 装饰图案 自从第一次学习编程设计模式以来,装饰器模式一直是我的最爱. 在我看来,这是一个很新颖的想法,比其他想法有趣得多. 不要误会我的意思,其他大多数人也引起了我的注意,但没有 ...

  7. 制作程序化装饰花纹图案_用装饰器设计图案装饰

    制作程序化装饰花纹图案 装饰图案是广泛使用的结构图案之一. 此模式在运行时动态更改对象的功能,而不会影响对象的现有功能. 简而言之,此模式通过包装将附加功能添加到对象. 问题陈述: 想象一个场景,我们 ...

  8. winform判断线程有没有完成_并发编程系列1:线程池的架构实现、大小配置、及四种线程池使用...

    △ 公众号回复关键词"架构" 即可领取<1500+BAT架构及面试专题合集> 本篇为线程池系列文章之一,不经常使用线程池的童鞋,还有对几种线程的使用不甚了解的童鞋,可以 ...

  9. java线程池饱和策略_干货:Java几种线程池的分析和使用。

    原标题:干货:Java几种线程池的分析和使用. 利用线程池的优势: 1.降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 2.提高响应速度.当任务到达时,任务可以不需要等到线程创建 ...

最新文章

  1. 查看EBS中BI Publisher的版本
  2. 当进度对话框和后台线程处于活动状态时,如何处理屏幕方向变化?
  3. php 过滤特殊字符和sql防注入代码以及xss攻击等
  4. SSL *** 安全解决方案
  5. 基于JAVA+SpringMVC+Mybatis+MYSQL的心理咨询预约系统
  6. 部门日报系统部署备忘录
  7. 计算机网络学习笔记(26. Web缓存技术)
  8. 相关不是因果,哪又是啥?
  9. Junit +cucumber 运行报错 initiallizationError
  10. 产品经理的高阶能力:架构图的设计与画法
  11. IDEA打包Springboot项目,运行
  12. matlab的开方算法_[转载]数值计算方法中的一些常用算法的Matlab源码
  13. 二叉树非递归遍历(前序遍历)
  14. 苹果系统 怎么找到共享计算机,Mac电脑怎么访问共享文件夹
  15. 装修首页自定义全屏视频播放效果gif动态图片制作视频教程播放代码操作设置全屏居中阿里巴巴国际站
  16. 360WiFi的服务器网站,360随身无线wifi怎么搭建web认证网页
  17. linux 的压缩文件格式,常见压缩文件的格式及linux中打包或解压的方法
  18. crypto-js前端解密工具
  19. 城市规划者建议将社区的所有马桶更换为每次冲水仅需2升的节水马桶。
  20. 崩三类卡通渲染解析及制作规范

热门文章

  1. 51nod1743-雪之国度【最小生成树,LCA,并查集】
  2. jzoj4025-找回密码【后缀自动机】
  3. 【2018.3.24】模拟赛之四-ssl2548 旋转【暴力模拟】
  4. 牛客练习赛10 F-序列查询(莫队+链表)
  5. 线段树-Pudding Monster CF526F-单调栈
  6. Hadoop入门(二十一)Mapreduce的求和程序
  7. JS 获取浏览器、显示器 窗体等宽度和高度
  8. Oracle入门(十二C)之表修改
  9. Mysql的安装与远程登录
  10. 12-多对一添加操作(添加新客户及对应的新订单)