加入收藏 | 设为首页 | 会员中心 | 我要投稿 宣城站长网 (https://www.0563zz.cn/)- 数据湖、行业智能、边缘计算、开发、备份!
当前位置: 首页 > 站长资讯 > 动态 > 正文

打破“存储墙”迫在眉睫

发布时间:2021-01-30 12:35:25 所属栏目:动态 来源:互联网
导读:拿破仑波拿巴曾说过一句话:对于战争,我们需要三样东西,金钱,金钱和更多的金钱。 编程学习同样需要编程,编程和不断编程,这是让你的编程技能变得更好的方式。 或许你已经编程多年了,但是我敢打赌你依然会碰到处理不了的难题,你可能正在找一份工作,但

拿破仑·波拿巴曾说过一句话:“对于战争,我们需要三样东西,金钱,金钱和更多的金钱。”

编程学习同样需要编程,编程和不断编程,这是让你的编程技能变得更好的方式。

或许你已经编程多年了,但是我敢打赌你依然会碰到处理不了的难题,你可能正在找一份工作,但却不知道如何脱颖而出,你也可能正在参加一个大项目,但却困难重重。如果你想要摆脱这种恶性循环,你需要跳出思维框架并挑战自己,这里分享4种提高编程技能的方式,希望对你有所帮助。

1. 重构现有工具
 

通过执行代码我们可以发现,返回结果并不是我们想看到的5000,说明这个是线程不安全的类

主要是因为当我们执行 conut++时分成了三步:1、取出当前内存count值,这时count值时最新的 2、+1操作 3、重新写回主存

例如:有两个线程同时在执行 count++,两个内存都执行了第一步,比如当前count值为99,它们都读到了这个count值,然后两个线程分别执行了 +1,并写回主存,这样就丢掉了一次 +1的操作。

五、线程安全性:有序性

  • 在JMM中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。
  • 通过volatile、synchronized、lock保证有序性

5.1 happens-before原则

  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作
  • 锁定规则:一个 unLock操作先行发生于后面对同一个锁的 Lock()操作,也就是说只有先解锁才能对下面的线程进行加锁
  • volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
  • 传递规则:如果操作A先行发生与操作B,而操作B先行发生于操作C,则操作A先行发生于操作C
  • 线程启动规则: Thread对象的 start()方法先行发生于此线程的每一个动作,一个线程只有执行了 start()方法后才能做其他的操作
  • 线程终端规则:对线程 interrupt()方法的调用先行发生与被中断线程的代码检测到中断事件的发生(只有执行了 interrupt()方法才可以检测到中断事件的发生)
  • 线程终结规则:线程中所有操作都先行发生于线程的终止检测,我们可以通过 Thread.join()方法结束, Thread.isAlive()的返回值手段检测到线程已经终止执行
  • 对象终结规则:一个对象的初始化完成先行发生于他的 finalize()方法的开始

六、线程安全性:总结

  • 原子性:Atomic包、CAS算法、synchronized、Lock
  • 可见性:synchronized、volatile

一个主内存的线程如果进行了修改,可以及时被其他线程观察到,介绍了volatile如何被观察到的

  • 有序性:happens-before原则 happens-before原则,观察结果,如果两个线程不能偶从happens-before原则观察出来,那么就不能观察他们的有序性,虚拟机可以随意的对他们进行重排序

(编辑:宣城站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读