V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
orbwalker
V2EX  ›  Java

关于线程安全,请教各位。

  •  
  •   orbwalker · 2019-09-18 20:42:12 +08:00 · 3279 次点击
    这是一个创建于 1894 天前的主题,其中的信息可能已经有所发展或是发生改变。

    关于线程安全:
    -------------------------------

    
    //例 1:锁加在共享资源操作之前
    synchronized(xxx.class){
    money--;
    }
    -------------------------------
    
    //例 2:锁加在判断之前
    synchronized(xxx.class){
    if(money > 0){
    money--;
    }
    }
    -------------------------------
    问:例 1 可能导致另一个线程进入判断中,
    但也可以保证不能同时操作共享资源吧?

    6 条回复    2019-09-24 22:54:46 +08:00
    hspeed18
        1
    hspeed18  
       2019-09-18 20:55:45 +08:00   ❤️ 1
    是的,然而并没有什么用,判断和修改应该是原子操作
    tachikomachann
        2
    tachikomachann  
       2019-09-18 20:58:49 +08:00 via Android   ❤️ 1
    例 1 可能出现 money 小于等于 0 的情况
    leonme
        3
    leonme  
       2019-09-19 08:48:42 +08:00 via Android   ❤️ 1
    感觉问题没表达清楚
    sagaxu
        4
    sagaxu  
       2019-09-19 09:06:29 +08:00 via Android   ❤️ 1
    这两段代码,一个有判断,一个没判断,逻辑都不同,有可比性?
    SoloCompany
        5
    SoloCompany  
       2019-09-20 13:56:04 +08:00 via iPad   ❤️ 1
    我猜,你想问的应该是 dcl
    magiclz233
        6
    magiclz233  
       2019-09-24 22:54:46 +08:00   ❤️ 1
    你想说的应该是例 1 的判断再加锁之外,判断这个操作是没有加锁的,会出现问题,但是进去之后加锁了,money--是不会出现问题的,如果锁中只有--操作,也可以 volatile 或者 atom 一些类,不需要加锁。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1088 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:27 · PVG 07:27 · LAX 15:27 · JFK 18:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.