热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

新兴技术成熟度曲线

Gartner公司发布了年度新兴技术成熟度曲线。Gartner认为,2017年技术成熟度曲线揭示了未来5-10年的三方面技术趋势。未来10年,人工智能将成为最具颠覆性的技术。通用人工智能神经形

Java 并发编程笔记 1 - 竞争条件 & 初识原子类 & 可重入锁

我们知道, 在多线程访问一个共享变量的时候会发生安全问题

首先看下面例子:publicclassCounter{

privateintcount;

publicvoidadd(){

try{

for(inti&#61;0;i<200;i&#43;&#43;){

Thread.sleep(100);

this.count&#43;&#43;;

System.out.println(this.count);

}

}catch(Exceptione){

e.printStackTrace();

}

}

}

publicclassTest{

publicstaticvoidmain(String[]args){

finalCountercounter&#61;newCounter();

newThread(newRunnable(){

publicvoidrun(){

counter.add();

}

}).start();

newThread(newRunnable(){

publicvoidrun(){

counter.add();

}

}).start();

newThread(newRunnable(){

publicvoidrun(){

counter.add();

}

}).start();

}

}

运行结果如下:

ab7653affab982b574eb7acc55df2e04.gif

如果没发生线程对数据的赃操作, 3 个线程执行, 结果会累加到 600 的, 看上面结果明显没有, 并且出现一下重复的数据这是因为存在 3 个线程同时操作同一个数字, 导致输出重复数字

解决办法:

1. 在方法上加上 synchronized 关键字如下图:

ab7653affab982b574eb7acc55df2e04.gif

虽然结果不会出现重复, 但是 synchronized 效率及其低下, 运行速度明显被拖慢原因是, for 循环中的 i 变量是每个线程都有独自的局部变量, 各不影响, 但是每个线程都要排队进入这个方法, 排队睡觉, 这样就导致效率低下

2. 在竞争条件上加 synchronized, 我们知道各个线程其实竞争的是 count 这个成员变量因此在此地方加即可如下图:

ab7653affab982b574eb7acc55df2e04.gif

这样运行效率比方法一快了很多, 因为省去了排队进入方法, 排队睡觉只需要排队取 count 值即可, 这样效率比方法一快

注意上图中, 输出语句并不是竞争条件, 并不一定要放在 synchroized 里面, 这里放在里面是为了让线程取到值自增后立即输出, 这样输出就不会发生混论, 不发生抢占输出问题, 一样能累加到 600,

如果把输出放在 synchronized 外面会出现值有重复现象, 因为累加后的值并没有立即输出, 这样导致输出混乱, 但仍然能加到 600. 知识输出不安全罢了

3. 使用原子类型, 比如将上面的代码的 int count 类型改成 AtomicInteger count 类型, 我们知道获取 count 的值然后再自加个 1 是可能会出现问题的, 也就是结果出现重复数字 AtomicInteger 类型是以同步的方法解决这个问题的如下图:

ab7653affab982b574eb7acc55df2e04.gif

结果如下图:

ab7653affab982b574eb7acc55df2e04.gif

可以看到数字的输出没有严格的排队, 但是数据确实给你保证的了, 就是完整的加到 600. 这也恰恰因为不是严格的进行排队, 才是的这种方法比前面两种方法的效率大大改进

理论总结: synchronized 是一种内部锁, 就是所对象内部给我们提供的, 因为每一个对象有一个状态变量, 相当于一个锁, 进入同步块, 改变这个变量别的线程进入之后就要判断这个变量有没有改变

一个线程获取它本生已经持有的锁, 这是可以成功的我们知道多个线程同时抢占同一个锁它们是失败的因为它们之间是互斥的但是呢, 一个线程再次获取一个自己已经拿过的锁是可以成功的, 那么它是能够成功的

看如下例子:publicclassWidget{

publicsynchronizedvoiddoSth(){

}

}

publicclassChildWidgetextendsWidget{

&#64;Override

publicsynchronizedvoiddoSth(){

super.doSth();

}

}

publicclassTest{

publicstaticvoidmain(String[]args){

Widgetw&#61;newChildWidget();

w.doSth();

}

}

子类调用自己的方法的那个 synchroized 那个锁是 w 对象的这个锁, 而在子类方法中的 super.doSth() 父类中的方法的 synchronized 的锁也是 w 对象的锁因此不要被子类继承父类的方法中的锁所迷惑了

因此这种方式叫做内部锁的可重入机制, 也叫可重入锁

来源: http://www.bubuko.com/infodetail-2515321.html



推荐阅读
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
  • 本博文基于《Amalgamationofproteinsequence,structureandtextualinformationforimprovingprote ... [详细]
  • 3年半巨亏242亿!商汤高估了深度学习,下错了棋?
    转自:新智元三年半研发开支近70亿,累计亏损242亿。AI这门生意好像越来越不好做了。近日,商汤科技已向港交所递交IPO申请。招股书显示& ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 也就是|小窗_卷积的特征提取与参数计算
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了卷积的特征提取与参数计算相关的知识,希望对你有一定的参考价值。Dense和Conv2D根本区别在于,Den ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • 本人学习笔记,知识点均摘自于网络,用于学习和交流(如未注明出处,请提醒,将及时更正,谢谢)OS:我学习是为了上 ... [详细]
author-avatar
手机用户2502870493
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有