在并发访问大的情况下为了防止出现获取的是脏数据所以需要采用 声明 synchronized 进行同步处理那么当并发访问量大的情况下使用synchronized 是否对系统开销很大?如果我通过程序去处理防止脏数据而不采用synchronized ,这2种方式哪种会好一些,为什么?

解决方案 »

  1.   

    你就这个问题就相当于hibernte中的乐观锁和悲观锁,你看看这2个概念你就清楚了
      

  2.   

    synchronized会解决可见性问题、原子性问题、互斥访问你用程序怎么做?但一个visibility,还有比用同步机制更简单的办法吗?关于可见性的重要性见这里:http://www.ticmy.com/?p=5在锁竞争非常激烈的情况下,增加了大量的上下文切换,CPU需要耗费大量的资源来做这个事情,自然吞吐量会下降。在锁竞争不激烈的情况下,synchronized是没有太大影响的。即使并发非常大,也未必会出现大的锁竞争,这要看程序怎么实现了。
      

  3.   

    如果测试发现锁竞争很激烈,那么可以使用几种方式来减缓,比如:减小锁的粒度,譬如不相关的变量用不同的锁来保护;
    实现一些lock-free算法
    减少锁占用的长度,将不需要使用锁的代码移除出同步区域(当然,jvm锁粗化可能又将你移除出的代码移回去了,但这只是一种可能性)
    等等等等,诸如此类
      

  4.   

    synchronized 蛮容易出现同步锁
      

  5.   

    通常在一个多线程环境下,我们需要共享某些数据,但为了避免竞争条件引致数据出现不一致的情况,某些代码段需要变成原子操作去执行。这时,我们便需要利用各种同步机制如互斥去为这些代码段加锁,让某一线程可以独占共享数据,避免竞争条件,确保数据一致性。但可惜的是,这属于阻塞性同步,所有其他线程唯一可以做的就是等待。基于锁的多线程设计更可能引发死锁、优先级倒置、饥饿等情况,令到一些线程无法继续其进度。锁无关(Lock free)算法,顾名思义,即不牵涉锁的使用。这类算法可以在不使用锁的情况下同步各个线程。对比基于锁的多线程设计,锁无关算法有以下优势:    对死锁、优先级倒置等问题免疫:它属于非阻塞性同步,因为它不使用锁来协调各个线程,所以对死锁、优先级倒置等由锁引起的问题免疫;
        保证程序的整体进度:由于锁无关算法避免了死锁等情况出现,所以它能确保线程是在运行当中,从而确保程序的整体进度;
        性能理想:因为不涉及使用锁,所以在普遍的负载环境下,使用锁无关算法可以得到理想的性能提升。 http://www.ibm.com/developerworks/cn/java/j-lo-lockfree/?S_TACT=105AGX52&S_CMP=NL&ca=dnl-cn-07232008
      

  6.   

    我所说的不是共享同一个数据哦,大家可能理解错了。。我说的是并发去的从一个数据表中取数据,有可能相互之间会出现取同样的数据。所以提出采用synchronized 和程序处理的机制。