iteye_2555 2009-04-20 10:02
浏览 229
已采纳

关于数据同步和并发(java)

比如一个客户表有id、personId(获得客户的人的id),有很多人做获取同一个客户操作,但是只有最先操作的人才可以获得要怎么做呢?关键是性能问题?我想到的只是同步锁定操作的方法,但是并不可行,锁定了方法后不同的客户id也不能同时操作了,各位请帮忙看看!谢谢!
[b]问题补充:[/b]
在代码里加一个同步的方法,也是我想到的,想问题下,如果不同的2人同时获取不同的客户,他们用的代码是不是同一个呢?那样的话,他们就是不能同时操作?

  • 写回答

2条回答 默认 最新

  • iteye_14762 2009-04-20 10:28
    关注

    你的想法是可行的,只是对同一个Id进行锁就可以了,看了下面的代码就明白了:
    [code="java"]

    public class Syn {

    private static final int DEFAULT_LOCK_CLEAR_LIMIT = 1000;
    
    private int lockClearLimit = DEFAULT_LOCK_CLEAR_LIMIT;
    
    private final Map<Object, Object> LOCKS = new HashMap<Object, Object>();
    
    /**
     * 如果是同一个id, 拿到的锁就是同一个,不同的就拿到不同的锁,所以不同的id可以同时操作的
     * 
     * @param id
     * @throws Exception
     */
    public void syntest(String id) throws Exception {
        Object lock;
        synchronized (LOCKS) {
            if (LOCKS.size() > lockClearLimit) {
                LOCKS.clear();
            }
            lock = LOCKS.get(id);
            if (lock == null) {
                lock = new Object();
                LOCKS.put(id, lock);
            }
        }
        synchronized (lock) {
    
            // 做你要做的在这里...
        }
    }
    

    }

    [/code]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 根据以下文字信息,做EA模型图
  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥60 关机时蓝屏并显示KMODE_EXCEPTION_NOT_HANDLED,怎么修?
  • ¥66 如何制作支付宝扫码跳转到发红包界面