热门标签 | 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



推荐阅读
  • 每日一书丨AI圣经《深度学习》作者斩获2018年图灵奖
    2019年3月27日——ACM宣布,深度学习之父YoshuaBengio,YannLeCun,以及GeoffreyHinton获得了2018年的图灵奖, ... [详细]
  • Python 数据可视化实战指南
    本文详细介绍如何使用 Python 进行数据可视化,涵盖从环境搭建到具体实例的全过程。 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 能够感知你情绪状态的智能机器人即将问世 | 科技前沿观察
    本周科技前沿报道了多项重要进展,包括美国多所高校在机器人技术和自动驾驶领域的最新研究成果,以及硅谷大型企业在智能硬件和深度学习技术上的突破性进展。特别值得一提的是,一款能够感知用户情绪状态的智能机器人即将问世,为未来的人机交互带来了全新的可能性。 ... [详细]
  • PHP开发人员薪资水平分析:工程师平均工资概况
    PHP开发人员薪资水平分析:工程师平均工资概况 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 理工科男女不容错过的神奇资源网站
    十一长假即将结束,你的假期学习计划进展如何?无论你是在家中、思念家乡,还是身处异国他乡,理工科学生都不容错过一些神奇的资源网站。这些网站提供了丰富的学术资料、实验数据和技术文档,能够帮助你在假期中高效学习和提升专业技能。 ... [详细]
  • 人工智能推理能力与假设检验
    最近Google的Deepmind开始研究如何让AI做数学题。这个问题的提出非常有启发,逻辑推理,发现新知识的能力应该是强人工智能出现自我意识之前最需要发展的能力。深度学习目前可以 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • 第五章5.4安全设备防火墙防火墙是网络关联的重要设备,用于控制网络之间的语言。外部网络用户的访问必须先经过安全策略过滤,而内部网络用户对外部网络的访 ... [详细]
  • 第三届人工智能、网络与信息技术国际学术会议(AINIT 2022)
    20223rdInternationalSeminaronArtificialIntelligence,NetworkingandInformationTechnology第三届 ... [详细]
  • 我在滴滴数据分析岗实习8个月的收获(文末附内推机会)
    我在滴滴数据分析岗实习8个月的收获(文末附内推机会)作者:海潮来源:数据管道大家好,我是宝器!今天分享一下交流群里海潮兄弟的「数据分析岗」求职与工作经验,以下是海潮兄弟的自诉,全文 ... [详细]
  • R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的RossIhaka和RobertGentleman开发(也因此称为R),现在由R开 ... [详细]
  • 全文共3708字,预计学习时长10分钟图源:unsplashPthon之所以能成为世界上最受欢迎的编程语言之一,与其整体及其相关库的生态系 ... [详细]
  • AI行业的下一个风口是医疗?创业者们这样说
    ▼点击上方蓝字关注网易智能为你解读AI领域大公司大事件,新观点新应用编者按:4月10日,鲸准AI产业价值峰会在北京举行。本次大会除了邀请A ... [详细]
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社区 版权所有