百科问答小站 logo
百科问答小站 font logo



Java的同步机制比起pthread方式有何优点? 第1页

  

user avatar   rednaxelafx 网友的相关建议: 
      

嗯。Java在语言层面上设计的同步机制是个大败笔。没啥优点可言。C#不幸掉进同一坑里了,叹气。

失败主要是在于:

  • 让所有Object都可以当作锁用,增加了JVM高性能实现的复杂度。毕竟Java系统里绝大部分对象从创建到死亡都不会被当作锁来用,让每个对象都要保留空间去存储潜在的被锁的信息是个很大的浪费。所以高性能的JVM实现都会想各种办法去让对象只在需要的时候才开辟空间去存储锁的信息。这么一来原始的败笔设计虽然不影响性能,但让JVM的实现变得复杂。
    • 正确的设计还是应该有专门的锁类型,只让这些对象可以被当作锁来使用,那么普通对象自然就不需要管锁不锁的事情。
  • 语法层面上的synchronized语句简单归简单,但功能不够灵活,无法表达出Mutex / Lock、Condition等的完整功能。其实在有了Java 7的try-with-resources语句之后,可以很直观地在库里设计出跟synchronized一样好用的锁类型。

对比语言层面的synchronized语句:

       synchronized (obj) {   // ... }     

跟假如说使用了try-with-resources语句的锁设计:

       try (mylock.lock()) {   // ... } // auto-unlock at the end with an implied finally clause     

是不是差不多一样好用?

所以在Java 5引入java.util.concurrent.locks的库层面上的锁之后,很多人都会选择使用这个而不是用synchronized语句来实现自己需要的同步功能。可惜java.util.concurrent.locks包下的锁没有更新为使用try-with-resources功能,所以用的时候还是得自己 lock.lock(); try { ... } finally { lock.unlock(); }。

(刚发了封邮件去问OpenJDK的core-libs-dev看有没有人对try-with-resoures版API感兴趣:

A bit of sugar for j.u.c.locks with try-with-resources?

等回复看看大佬们怎么说。)

考虑Java设计之初的时间背景:当时在语言层面提供完善的多线程支持的语言还没多少,Java算是探索了一种可能的设计,原本是想通过语法支持来方便多线程编程,而后来它的各种弊端才展现出来。




  

相关话题

  江湖上流传着哪些关于R大RednaxelaFX的黑暗传说? 
  为什么IT书籍的翻译质量相比其他尤其被诟病? 
  如何理解互斥锁、条件锁、读写锁以及自旋锁? 
  两年嵌入式C语言编程经验,如果有机会做和 Android 相关的 C++、JAVA,还有 Javascript 脚本开发工作,转过去好吗? 
  自学Java最起码要学到什么程度? 
  RednaxelaFX 是谁? 
  为什么java版本更新这么慢? 
  下面代码是线程不安全的代码,请问为什么很难跑出不安全的样例? 
  为什么时效上具有明显优势的基数排序(radix sort)没有快速排序流行? 
  为什么依赖注入只在 Java 技术栈中流行,在 go 和 cpp 没有大量使用? 

前一个讨论
有哪些游戏是体现人性本恶的?
下一个讨论
软件开源后,能否有开源和商业化两种授权?





© 2024-11-22 - tinynew.org. All Rights Reserved.
© 2024-11-22 - tinynew.org. 保留所有权利