开发者社区> 问答> 正文

[@徐雷frank][¥20]作为java开发者应该处理多线程?怎么样编码好多线程程序?

为了充分利用cpu加快运算,这时候我们就会用到多线程,但是用到多线程时就会面对一个共享变量的问题。为了共享变量的同步我们对线程 代码加锁。但是加锁过程中又会让其他线程进行等待这样就会耗时很大。 那请问,我们应该怎么对待共享变量,使得多线程程序运行结果正确而不会像加锁那样造成等待的耗时?原子操作还是?原子操作内部实现是一个期望值和当前值比较?如果一直比较失败呢?那作为java开发者应该处理多线程?怎么样编码好多线程程序?

问题来自Java技术沙龙的舒超群
Java线下沙龙报名链接:https://yq.aliyun.com/activity/796

展开
收起
管理贝贝 2018-12-01 16:44:26 2575 0
1 条回答
写回答
取消 提交回答
  • 1.阿里云大学讲师,主讲《微服务Spring Cloud设计与开发实战》《MongoDB高级实战》等课程 2.MongoDB中文社区专家 3.《MongoDB实战》第2版译者 5.吉林大学计算机科学学士、上海交通大学硕士

    问题很好。Java的多线程编程是很重要的知识点。
    Java程序员可以看看《Java并发编程的艺术》相关的书籍,目前对于大部分Java程序员来说,做好多线程编程,最好是依赖底层的框架。相对来说出问题的概率比较低,而且容易实现。如果非常熟练,可以参考编写一些多线程的代码。
    Java多线程目前封装比较好的框架是JUC库。可以直接使用。
    多线程,如果数据都是隔离,每个线程单独所有,不会出现线程安全问题,相对简单。
    但是如果涉及到共享问题,就比较麻烦。涉及线程安全必然有锁的问题,Lock和Synchronized关键字的使用。
    共享资源加锁,一般说为悲观锁,必然会导致其他线程等待,尽快处理,及时释放是最好的策略。
    如果是乐观锁,并发问题相对处理简单,但是无法保证数据一致性。
    Lock接口允许自己实现共享资源的锁定和释放,效率高,编码工作量大。
    Synchronized相对简单,关键字,但是性能不如Lock.
    你提到的CAS也是CPU低等的指令。效率比较高。
    如果可以尽量使用现有的Java多线程框架,可以降低底层的编码实现难度,线程调度和锁机制太复杂。
    积累一定经验,或者项目实在需要,标准框架无法满足的时候,可以尝试优化,或者自己实现多线程代码。

    2019-07-17 23:17:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载