为了充分利用cpu加快运算,这时候我们就会用到多线程,但是用到多线程时就会面对一个共享变量的问题。为了共享变量的同步我们对线程 代码加锁。但是加锁过程中又会让其他线程进行等待这样就会耗时很大。 那请问,我们应该怎么对待共享变量,使得多线程程序运行结果正确而不会像加锁那样造成等待的耗时?原子操作还是?原子操作内部实现是一个期望值和当前值比较?如果一直比较失败呢?那作为java开发者应该处理多线程?怎么样编码好多线程程序?
问题来自Java技术沙龙的舒超群
Java线下沙龙报名链接:https://yq.aliyun.com/activity/796
问题很好。Java的多线程编程是很重要的知识点。
Java程序员可以看看《Java并发编程的艺术》相关的书籍,目前对于大部分Java程序员来说,做好多线程编程,最好是依赖底层的框架。相对来说出问题的概率比较低,而且容易实现。如果非常熟练,可以参考编写一些多线程的代码。
Java多线程目前封装比较好的框架是JUC库。可以直接使用。
多线程,如果数据都是隔离,每个线程单独所有,不会出现线程安全问题,相对简单。
但是如果涉及到共享问题,就比较麻烦。涉及线程安全必然有锁的问题,Lock和Synchronized关键字的使用。
共享资源加锁,一般说为悲观锁,必然会导致其他线程等待,尽快处理,及时释放是最好的策略。
如果是乐观锁,并发问题相对处理简单,但是无法保证数据一致性。
Lock接口允许自己实现共享资源的锁定和释放,效率高,编码工作量大。
Synchronized相对简单,关键字,但是性能不如Lock.
你提到的CAS也是CPU低等的指令。效率比较高。
如果可以尽量使用现有的Java多线程框架,可以降低底层的编码实现难度,线程调度和锁机制太复杂。
积累一定经验,或者项目实在需要,标准框架无法满足的时候,可以尝试优化,或者自己实现多线程代码。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。