例如有段代码如下:private void save(){
String num='获取编号',String sql ="insert aa (lsh,name) values ('"+num+"','kk')";con.createStatement().execute(sql);log.info(sql);
}这个表aa中的lsh只能是唯一,我在日志里有发现,这块代码有同步问题,导致插入lsh的时候出错,
我现在能不能在该方法加个锁如下:
 private synchronized  void save()
这样会不会解决该同步问题?是否会影响效率?指教了。

解决方案 »

  1.   

    你是不是说lsh这个是自动编号的吗?
      

  2.   

    要是lsh是主键,你可以把他设置成自增的,或者使用UUID来处理,这样就不会有同步的问题了
      

  3.   

    如果你的String num='获取编号'是从数据库来的,那就每次save都是“取、存”两次数据库操作,再加个同步,效率当然要受损了。
    即使同步,也不如做个static的变量num,这样至少省了“取”的数据库操作。
    其实是如3楼说的,不用考虑同步,自增就好。
      

  4.   

    加上synchronized不一定有效,除非保证你这个类只有一个实例,否则不同的线程访问不同的实例,也就没意义了。
    如果取编号也是来自数据库,那么把取编号和插入写到一个事务(存储过程)里,在事务开始时对目标表进行锁表