可能重复:
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) {
}
}
感谢您的帮助。
答案 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可以被任何一个对象获取。因此,您一次只能保证一张请求书票。因此,不允许重复预订]。