java synchronized c_java的synchronized关键字是语法糖吗?

java的synchronized关键字是语法糖吗?

对于从C/C++时代过来的Coder来说,绝对可以算语法糖。

在很多年以前(大概十几年吧),C++没有自己的多线程库(现在boost中有thread库,而且已经被接受为C++标准),于是编写多线程相关代码变得非常繁琐,在windows上要使用beginthreadex_这样的函数,而在linux上则是pthread。于是第三方多线程库例如JTC之类的成了C++跨平台的选择之一。

当时比较火的CORBA可以同时支持C++和Java等多种语言,为了保持跨平台特性,使用了IDL语言(Interface Definition Language)先定义对象,然后编译为C++或者Java语言。IDL中就有synchronized关键字,对于Java来说,直接翻译为synchronized就行,对于C++来说,则是翻译为一个宏SYNCHRONIZED,这个宏则会使用C++的多线程库中的锁来实现。(再多说一句,IDL这个东东自CORBA没落后我认为再也不会看到了,没有想到Android中也大量运用了,用来搞那个Binder)

因此我认为,Java中的这个synchronized关键字绝对可以算一个语法糖。

如果不是语法糖,那么它的底层实现是什么?

它的底层实现前面已经有人说过了,就是由synchronized修饰的代码块,编译时在字节码中插入monitorenter/monitorexit指令,实现并发调用时的互斥性。在JDK1.5之前,Java只有synchronized这种互斥锁,其多线程能力其实是很弱的,连一个Lock或者Mutex类都没有,这让C++程序员非常不适应。

和concurrent.locks包下的锁有什么不同?

自JDK1.5之后,Java引入了JUC包,添加了大量同步互斥的并发类,其中当然也包括锁类。

关于这一点,我刚好写了一系列文章,可以参考一下:

你可以重点看第四篇。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值