拿破仑·波拿巴曾说过一句话:“对于战争,我们需要三样东西,金钱,金钱和更多的金钱。”
编程学习同样需要编程,编程和不断编程,这是让你的编程技能变得更好的方式。
或许你已经编程多年了,但是我敢打赌你依然会碰到处理不了的难题,你可能正在找一份工作,但却不知道如何脱颖而出,你也可能正在参加一个大项目,但却困难重重。如果你想要摆脱这种恶性循环,你需要跳出思维框架并挑战自己,这里分享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原则观察出来,那么就不能观察他们的有序性,虚拟机可以随意的对他们进行重排序
(编辑:宣城站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|