使用spring定时启动一个job,然后会查询数据库,启动n个线程,每个线程需要执行一系列操作。例如:
我的一个线程 需要执行两个 synchronized方法(f1和f2),输出一些内容 ,然后结束。现在输出的内容无法按照f1 f2 的顺序输出,例如:f1-- f2-- f1-- f2--,但是实际上是乱的:f1-- f1-- f2-- f2-- 等等,反正就是乱的,至于怎么个乱法是不确定的。不知道我哪里出了问题?我使用的是synchronized method(){}这种方式来实现同步的。多线程Springsynchronized

解决方案 »

  1.   

    但是多个线程里面的方法没有原子化执行啊,我是这个意思。线程有块又慢那个无所谓,至少一个线程里面的方法要执行完才到下一个线程吧?
    你那是单线程程序才能这样吧!多线程你没办法让它们顺序执行的!怎么不懂我意思呢?现在都没法保证synchronized方法里面的操作是满足原子性的,也就是说那个synchronized方法里面两个操作中间夹杂着另外一个线程调用这个方法
      

  2.   

    真水你看是不是这样:synchronized方法的同步对象是当前对象,因为每次都是new Thread().start() 所以实际上没有同步成功
      

  3.   

    但是多个线程里面的方法没有原子化执行啊,我是这个意思。线程有块又慢那个无所谓,至少一个线程里面的方法要执行完才到下一个线程吧?
    你那是单线程程序才能这样吧!多线程你没办法让它们顺序执行的!怎么不懂我意思呢?现在都没法保证synchronized方法里面的操作是满足原子性的,也就是说那个synchronized方法里面两个操作中间夹杂着另外一个线程调用这个方法synchronized代表的是占用资源不共享,你看看方法里同步的哪一块,是不是方法的问题。比如2个人,A身上synchronized修饰了上衣和裤子,但是B却只是穿插的使用了A的鞋子。按你说的是synchronized修饰情况下却出现B使用A上衣的问题,这........再检查检查吧。
      

  4.   

    但是多个线程里面的方法没有原子化执行啊,我是这个意思。线程有块又慢那个无所谓,至少一个线程里面的方法要执行完才到下一个线程吧?
    你那是单线程程序才能这样吧!多线程你没办法让它们顺序执行的!怎么不懂我意思呢?现在都没法保证synchronized方法里面的操作是满足原子性的,也就是说那个synchronized方法里面两个操作中间夹杂着另外一个线程调用这个方法synchronized代表的是占用资源不共享,你看看方法里同步的哪一块,是不是方法的问题。比如2个人,A身上synchronized修饰了上衣和裤子,但是B却只是穿插的使用了A的鞋子。按你说的是synchronized修饰情况下却出现B使用A上衣的问题,这........再检查检查吧。
    我知道问题所在了,参见 http://blog.csdn.net/liumeiqqzj/article/details/7891395 ,不过我的需求里面需要传递参数给线程,因此单例还不怎么好搞,最后还是改成了synchronized代码块的方式来同步,每次new线程的时候传递参数+传递一个对象锁。
      

  5.   

    java.util.concurrent 包解决你的大多数需求
      

  6.   

    我有必要为一个小的功能使用并发连接池吗?那个东西说实话,我只是在它出来的时候研究过,后来就没用过,synchronized完全够用。
      

  7.   

    我没说线程之间谁先谁后,可能是我表述的有问题,根本问题是:一个线程访问的方法里面的操作不满足原子性synchronized static method(){}这种方式来实现同步的。 加static
      

  8.   

    我没说线程之间谁先谁后,可能是我表述的有问题,根本问题是:一个线程访问的方法里面的操作不满足原子性synchronized static method(){}这种方式来实现同步的。 加static
    我已经发现这个问题了,不过我的需求里面需要传参,用起来比较麻烦;然后选择了synchronized (o){}这种方式
      

  9.   

    我没说线程之间谁先谁后,可能是我表述的有问题,根本问题是:一个线程访问的方法里面的操作不满足原子性synchronized static method(){}这种方式来实现同步的。 加static
    我已经发现这个问题了,不过我的需求里面需要传参,用起来比较麻烦;然后选择了synchronized (o){}这种方式synchronized static method(){}这种方式 传参会有问题?