【问题标题】:Java synchronized difference threading [duplicate]Java同步差异线程[重复]
【发布时间】:2012-04-28 11:25:30
【问题描述】:

可能重复:
What is the difference between a synchronized method and synchronized block in Java?
What is the difference between a synchronized function and synchronized block?

我不明白这两个线程代码之间的区别我相信它是为了互斥但我不明白有什么区别你能帮我吗?

public synchronized void Method1 () {
  }

public myFunction (){
       synchronized (this) { 
     }
 }

感谢您的帮助。

【问题讨论】:

标签: java multithreading


【解决方案1】:

唯一的区别是减少了由锁保护的操作数量,这可以大大提高性能。

示例:假设我们有一个 servlet,它在输入中给出了一个很大的因子数组,我们想要计算 servlet 的启动频率。问题是同步访问状态变量requestsCount

//Poor performance
class PoorFactorizer implements Servlet {
    private int requestsCount = 0;
    public synchronized void service(ServletRequest req, ServletResponse res) {
        BigInteger numberToFactorize = extractFromRequest(req);
        BigInteger[] factors = factorize(numberToFactorize); // long lasting
                                 // operation makes everyone wait 
        requestCount++;
        encodeResponse(res, factors);
    }
}

//Better perfomance
class PoorFactorizer implements Servlet {
    private int requestsCount = 0;
    public void service(ServletRequest req, ServletResponse res) {
        BigInteger numberToFactorize = extractFromRequest(req);
        BigInteger[] factors = factorize(numberToFactorize); 
        // since we need to guard only the class' state
        // let's guard only the operation with the state
        synchronized(this) {            
            requestCount++;
        }
        encodeResponse(res, factors);
    }
}  

UPD:您可以在杰作“Java 并发实践”(第 2 章)中阅读非常好的解释。我强烈建议您从头到尾阅读这本书。

【讨论】:

  • +1 不过,一个例子会很好,因为问题没有显示 任何 操作。
【解决方案2】:

区别在于互斥的粒度。使用上面的代码,一次只能有一个线程调用 Method1;多个线程可能会调用 myFunction。但是,由于 myFunction 除了输入在“this”上同步的块之外什么都不做,因此没有实际区别。但是,myFunction 可能包含同步保护之外的其他代码,这些代码可以由多个线程同时执行。

【讨论】:

    【解决方案3】:

    从锁定的角度来看,两者的行为相同。唯一的区别是可以有任何非空对象用于同步块 即。

    public myFunction (){
       synchronized (anyObject) { 
     }
    }
    

    现在这个块可以基于这个对象进行同步。

    对于使用 synchronized 关键字的情况,其同步范围取决于调用对象。

    希望这对您有所帮助。享受编码!!!

    【讨论】:

      【解决方案4】:

      如果你有方法

      public synchronized void methodA()
      {
          while(condition)
          {
              // do Something That Takes A Minute ;
          } 
          // do Something That Needs A Lock;
          while(condition)
          {
              // do Something That Takes Another Minute ;
          } 
      }
      

      它将保持锁定2分钟以上

      public void methodA()
      {
          while(condition)
          {
              // do Something That Takes A Minute ;
          } 
          synchronized(this)
          {
              // do Something That Needs A Lock;
          } 
          while(condition)
          {
              // do Something That Takes Another Minute ;
          } 
      }
      

      在高并发应用程序的情况下,持有锁的时间差异非常显着。

      可以说,您可以将方法 2 分解为 2 个方法并在方法级别应用同步,但这有时可能会导致代码错误。

      所以这两个工具都是由 Java 提供的。

      【讨论】:

        【解决方案5】:

        看看区别

        • 当您同步方法时,方法被此对象隐式锁定,并且您锁定了整个方法,即使所有内容都可能对锁定并不重要。 (性能下降)。

        • 当你同步你的块时,你已经选择了锁定的关键代码(性能改进),你可以选择锁定对象。 [假设您有多个对象执行重要操作,例如预订可用座位,并且您有多个预订请求。您可能不允许所有人同时预订,也不想锁定此(当前对象)。在这种情况下,您需要有公共对象来获取锁定并执行操作。一次,任何一个对象都可以获取 Lock。因此,您保证一次只能预订一张请求者的票。因此,不允许重复预订]。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-07-25
          • 1970-01-01
          • 2016-04-04
          • 1970-01-01
          • 2016-09-11
          • 2013-03-01
          • 1970-01-01
          相关资源
          最近更新 更多