Java同步差异线程

时间:2012-04-17 05:54:41

标签: java multithreading

  

可能重复:
  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) { 
     }
 }

感谢您的帮助。

5 个答案:

答案 0 :(得分: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并发”(第2章)中阅读非常好的解释。我强烈建议从头到尾阅读本书。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

现在可以根据此对象同步此块。

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

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

答案 3 :(得分: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个方法并在方法级别应用synchronized,但这有时会导致错误的代码。

所以这两个设施都是由Java提供的。

答案 4 :(得分:0)

查看差异

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

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