V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 外包信息请发到 /go/outsourcing 节点。
• 不要把相同的信息发到不同的节点
zxc1234
V2EX  ›  酷工作

synchronized 锁住的是是什么

  •  
  •   zxc1234 · 2019-07-27 18:05:22 +08:00 · 4105 次点击
    这是一个创建于 1932 天前的主题,其中的信息可能已经有所发展或是发生改变。

    是受保护代码还是对象?

    有人说是代码 有人说是对象,请问是什么呢

    22 条回复    2019-07-30 05:55:38 +08:00
    zxc1234
        1
    zxc1234  
    OP
       2019-07-27 18:10:40 +08:00
    hqweay
        2
    hqweay  
       2019-07-27 18:16:32 +08:00 via Android
    两篇说的是不同角度,第一篇也说的锁对象。锁代码是和 锁变量 对比的答案吧。
    xaw483051011
        3
    xaw483051011  
       2019-07-27 18:21:02 +08:00 via iPhone
    我觉得叫资源
    zxc1234
        4
    zxc1234  
    OP
       2019-07-27 18:25:16 +08:00
    @hqweay 所以 synchronized 锁住的是对象?
    leonme
        5
    leonme  
       2019-07-27 18:40:02 +08:00 via Android
    资源比较合适,是代码块,方法,对象的总称,看你怎么用吧
    cxtrinityy
        6
    cxtrinityy  
       2019-07-27 18:44:00 +08:00   ❤️ 1
    synchonized 拿到指定对象持有的锁,来锁定特定代码块的执行,这样说比较容易理解
    misaka19000
        7
    misaka19000  
       2019-07-27 19:09:57 +08:00
    。。。。看一下我一起写的一篇文章吧

    https://www.nosuchfield.com/2017/03/22/Future-mode-in-Java/
    misaka19000
        8
    misaka19000  
       2019-07-27 19:10:18 +08:00
    @misaka19000 #7 一起 -> 以前
    zhgg0
        9
    zhgg0  
       2019-07-27 19:39:08 +08:00
    锁的信息记录在对象里。加锁时,将当前线程相关信息记录在对象里,执行完这段代码,将该信息去掉。
    普通方法锁信息记录在当前实例里,static 方法锁信息记录在 class 对象里,代码块锁信息记录在你传的那个对象里。
    ghui
        10
    ghui  
       2019-07-27 20:04:18 +08:00 via iPhone
    简单理解:锁住的就是代码。

    不同的是用什么作为锁,可以是 class 对象,可以是实例对象,也可以是你自己 new 的一个普通 object。通常情况下锁的力度尽可能小,这样可以减少不必要的锁等待
    lhx2008
        11
    lhx2008  
       2019-07-27 20:41:22 +08:00
    我更倾向于理解为锁只是个代码逻辑的通路,相当于一个红绿灯,代码经过这里都要检查,是要放行还是阻塞,就是这么简单。
    v5mark
        12
    v5mark  
       2019-07-27 21:11:55 +08:00
    物理上锁的是对象,逻辑上锁的是代码
    troywinter
        13
    troywinter  
       2019-07-28 02:49:43 +08:00
    兄弟,你这说法挺有意思,我还是第一次听说,锁的当然是对象,代码块只是用来说明这个锁的作用域,和锁住哪个对象没有关系,想象成现实世界的锁,你锁的只是那把锁,至于锁住的作用是一个房间还是一栋楼跟这把锁没有太大关系,在代码里只和你什么时候入锁什么时候出锁有关系。

    另外,这是面试题吗?
    zhengxiaowai
        14
    zhengxiaowai  
       2019-07-28 08:47:52 +08:00
    临界区比较合适
    davy1995
        15
    davy1995  
       2019-07-28 10:21:49 +08:00 via Android
    临界区代码
    rayu
        16
    rayu  
       2019-07-28 10:47:17 +08:00 via Android
    锁不一样,class 或者对象
    bobuick
        17
    bobuick  
       2019-07-28 15:17:34 +08:00
    锁或者同步概念, 都是计算机中竞态互斥. 不要就盯着个语言看. 本质是临界区的互斥, 各个语言通过关键字后, 自己实现与总线和 cpu 缓存关于临界区内容的定义. 锁一个变量, 变量就是临界区内的数据值, 锁一个对象, 对象就是临界区的数据.
    tyrantZhao
        18
    tyrantZhao  
       2019-07-28 17:16:48 +08:00
    一般不都是临界资源的吗?
    zxc1234
        19
    zxc1234  
    OP
       2019-07-30 00:17:48 +08:00
    @troywinter 是面试题,阿里的
    zxc1234
        20
    zxc1234  
    OP
       2019-07-30 00:18:12 +08:00
    @misaka19000 赞,拜读了
    zxc1234
        21
    zxc1234  
    OP
       2019-07-30 00:19:24 +08:00
    22F41628gA98q4Lx
        22
    22F41628gA98q4Lx  
       2019-07-30 05:55:38 +08:00
    所谓的锁只是一个标志,告诉你这里面有人罢了。
    你要是问锁住了什么东西是没有任何意义的。因为所谓的锁只是一个标识符,只是一个变量。
    那个问你锁住什么的面试官真的是 naive。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2625 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:09 · PVG 13:09 · LAX 21:09 · JFK 00:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.