你这里加锁的对象是当前这个对象synchronized(this),当多个线程尝试在同一个对象上获取锁的时候,会阻塞,反之,如果不是在同一个对象上,这个锁就无效了

解决方案 »

  1.   

    听说jdk1.6后synchronized性能提高了。使用乐观策略(即异常)比synchronized性能开销低很多吗?
      

  2.   

    个人经验和理解:如果你的系统不是并发大到了极致,一般都有比抠 到底是异常性能高还是synchronized性能高 更值得研究的性能问题。在实践中很少去考虑这些问题,因为在做性能调优的时候,会用80%的精力去解决带来80%性能瓶颈的问题。另外,我理解的乐观策略就是synchronized,反之悲观策略是手动加锁(Lock/Condition)
      

  3.   

    个人经验和理解:如果你的系统不是并发大到了极致,一般都有比抠 到底是异常性能高还是synchronized性能高 更值得研究的性能问题。在实践中很少去考虑这些问题,因为在做性能调优的时候,会用80%的精力去解决带来80%性能瓶颈的问题。另外,我理解的乐观策略就是synchronized,反之悲观策略是手动加锁(Lock/Condition)
    问题是我现在的情况是,需要同步的部分是个耗时的部分,是一个IO过程。我如果把整个IO过程都同步了,那么不是系统开销问题而是时间上要互相等待。
    再就是关于线程安全,到底是,如果线程不安全的话,仅仅是顺序不能保证,还是也有可能发生碰撞抛出异常?
      

  4.   

    你这个业务场景,用wait/notify的模型更合适,如果是单子任务,用wait/notify,如果有多个子任务,用cyclicbarrier
      

  5.   

    个人经验和理解:如果你的系统不是并发大到了极致,一般都有比抠 到底是异常性能高还是synchronized性能高 更值得研究的性能问题。在实践中很少去考虑这些问题,因为在做性能调优的时候,会用80%的精力去解决带来80%性能瓶颈的问题。另外,我理解的乐观策略就是synchronized,反之悲观策略是手动加锁(Lock/Condition)
    问题是我现在的情况是,需要同步的部分是个耗时的部分,是一个IO过程。我如果把整个IO过程都同步了,那么不是系统开销问题而是时间上要互相等待。
    再就是关于线程安全,到底是,如果线程不安全的话,仅仅是顺序不能保证,还是也有可能发生碰撞抛出异常?
    是这样的。。System.out.println本身就是一个同步的过程,你的synchronized块是多余的
    如果I/O操作需要同步,你可以考虑把它放在另一个线程中执行(如果I/O可以接受异步操作),所有的输入都放在一个Queue里然后I/O就只管自己了
      

  6.   

    个人经验和理解:如果你的系统不是并发大到了极致,一般都有比抠 到底是异常性能高还是synchronized性能高 更值得研究的性能问题。在实践中很少去考虑这些问题,因为在做性能调优的时候,会用80%的精力去解决带来80%性能瓶颈的问题。另外,我理解的乐观策略就是synchronized,反之悲观策略是手动加锁(Lock/Condition)
    问题是我现在的情况是,需要同步的部分是个耗时的部分,是一个IO过程。我如果把整个IO过程都同步了,那么不是系统开销问题而是时间上要互相等待。
    再就是关于线程安全,到底是,如果线程不安全的话,仅仅是顺序不能保证,还是也有可能发生碰撞抛出异常?
    是这样的。。System.out.println本身就是一个同步的过程,你的synchronized块是多余的
    如果I/O操作需要同步,你可以考虑把它放在另一个线程中执行(如果I/O可以接受异步操作),所有的输入都放在一个Queue里然后I/O就只管自己了I/O被封装了,不能动了。I/O前后要访问一个对象,每个I/O共访问两次。I/O存在并发。
      

  7.   

    个人经验和理解:如果你的系统不是并发大到了极致,一般都有比抠 到底是异常性能高还是synchronized性能高 更值得研究的性能问题。在实践中很少去考虑这些问题,因为在做性能调优的时候,会用80%的精力去解决带来80%性能瓶颈的问题。另外,我理解的乐观策略就是synchronized,反之悲观策略是手动加锁(Lock/Condition)
    问题是我现在的情况是,需要同步的部分是个耗时的部分,是一个IO过程。我如果把整个IO过程都同步了,那么不是系统开销问题而是时间上要互相等待。
    再就是关于线程安全,到底是,如果线程不安全的话,仅仅是顺序不能保证,还是也有可能发生碰撞抛出异常?
    是这样的。。System.out.println本身就是一个同步的过程,你的synchronized块是多余的
    如果I/O操作需要同步,你可以考虑把它放在另一个线程中执行(如果I/O可以接受异步操作),所有的输入都放在一个Queue里然后I/O就只管自己了
    我这个情况,顺序是无所谓的,我只解决碰撞问题。cyclicbarrier不合适,等待会浪费太多时间。I/O被封装了,不能动了。I/O前后要访问一个对象,每个I/O共访问两次。I/O存在并发。
    关于线程安全,到底是,如果线程不安全的话,仅仅是顺序不能保证,还是也有可能发生碰撞抛出异常?
      

  8.   

    解释太抽象了,再具体点。什么叫I/O前后要访问一个对象?I/O并发是什么意思?你有几个对象要被I/O访问?你的对象具体是什么样子?多个I/O访问同一个对象有没有关系?还有任何其他有助于帮你解决问题的细节都搬出来,代码片段最好。I/O就算封装了也应该有接口吧,接口长啥样?具体的情况采取不同的策略
      

  9.   

    你的问题,我好像都没有看懂!System.out 是个 PrintStream 的单实例对象,该对象存在线程安全问题,但是 PrintStream 的 println 实现,其内部已经进行同步处理,为什么还要在外面加个同步?
      

  10.   

    我用System.out.println代替了这部分项目代码,因为这部分是业务代码,公司严禁发到网上。但是不是什么特别的代码,就是个IO的东西。相当于println没有实现同步。