0

可能重复:
Java 中的同步方法和同步块有什么区别?
同步函数和同步块有什么区别?

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

public synchronized void Method1 () {
  }

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

谢谢您的帮助。

4

5 回答 5

3

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

示例:假设我们有一个 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 Concurrency in Practice》(第 2 章)中读到一个很好的解释。我强烈建议从头到尾阅读这本书。

于 2012-04-17T06:01:16.333 回答
0

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

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

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

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

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

于 2012-04-17T06:16:09.530 回答
0

如果你有方法

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 提供的。

于 2012-04-17T06:27:03.073 回答
0

看到不同

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

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

于 2012-04-17T06:41:56.507 回答
0

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

于 2012-04-17T06:07:00.690 回答