当前位置: 首页 > 面试题库 >

Java同步方法锁定对象还是方法?

武琛
2023-03-14
问题内容

如果我在同一个类中有2个同步方法,但是每个方法都访问不同的变量,那么2个线程可以同时访问这2个方法吗?锁是否发生在对象上,或者是否与同步方法中的变量一样具体?

例:

class X {

    private int a;
    private int b;

    public synchronized void addA(){
        a++;
    }

    public synchronized void addB(){
        b++;
    }

}

2个线程可以同时执行x.addA()访问类X的相同实例x.addB()吗?


问题答案:

如果将方法声明为已同步(就像你通过键入进行的操作一样public synchronized void addA()),则会在整个对象上进行同步,因此,从同一对象访问不同变量的两个线程仍然会相互阻塞。

如果你一次只想同步一个变量,那么两个线程在访问不同的变量时不会互相阻塞,你可以分别在synchronized ()块中同步它们。如果a和b是对象引用,则可以使用:

public void addA() {
    synchronized( a ) {
        a++;
    }
}

public void addB() {
    synchronized( b ) {
        b++;
    }
}

但是由于它们是原始类型,所以你不能这样做。

我建议你改用AtomicInteger:

import java.util.concurrent.atomic.AtomicInteger;

class X {

    AtomicInteger a;
    AtomicInteger b;

    public void addA(){
        a.incrementAndGet();
    }

    public void addB(){ 
        b.incrementAndGet();
    }
}


 类似资料:
  • 问题内容: Java教程说:“不可能在同一对象上两次调用同步方法。” 这对于静态方法意味着什么?由于静态方法没有关联的对象,所以synced关键字会锁定在类而不是对象上吗? 问题答案: 由于静态方法没有关联的对象, 所以synced关键字会锁定在类而不是对象上吗? 是。

  • 在示例代码中 在这个页面上, lock1和lock2分别控制c1和c2上的更新。 然而, 正在获取对象lock1的锁并在同步块时释放它 被执行。 当这个代码块被执行时,这个对象的成员c1上可能还有一个更新——我看不出这个更新是如何被代码中的lock1上的同步所阻止的。 只有对象lock1可以独占访问——除此之外别无它物(?) 那么,实施情况如何 在上面的代码中不同于 甚至 当c1是一个对象而不是一

  • 假设我有两条线。Thread1正在访问一个同步方法,同时,Thread2正在访问同一对象的另一个同步方法。据我所知,Thread2应该等到Thread1完成它的任务。我的问题是,Thread2是否在对象的等待线程列表中?对我来说似乎是这样,但Thread2不调用wait()方法,那么作为逻辑结果,它不应该在对象的等待线程列表中。如果它不在对象的等待线程列表中,那么Thread2的状态是什么?

  • 使用JPA乐观锁定,我们可以通过@Version字段控制一个数据库表是否同时被另一个事务更新,从而允许在数据库中存储可靠的数据。 如果Java应用程序只有一个CRUD服务负责数据库中的特定实体,我们也可以同步它的方法并管理信息在数据库中的存储顺序。 所以我的问题是,这些场景之间有什么区别?是否存在任何性能优势或者甚至是可遵循的最佳实践?

  • 我在学习K K 当一个方法从同步块中执行代码时,代码被称为在同步上下文中执行。当您同步一个方法时,用于调用该方法的对象是必须获取其锁的对象。但是当我们同步代码块时,您必须指定要使用哪个对象的锁作为锁。 在本例中,会在AccountDanger实例或Account对象上获取锁吗?我想应该是这样的。我感觉正确吗?如果它是AccountDanger对象,并且一个线程已获得AccountDanger锁,那

  • 问题内容: 我有一种将用于发送电子邮件的方法。我想锁定此方法,以便每次只有一个线程可以访问它,其余线程同时存储。我应该同步方法还是使用spring @transactional PROPAGATION_REQUIRED? 在我的服务层 问题答案: 为什么不通过不使用任何实例级别的东西使该方法成为线程安全的呢? 但是,我看不到Spring的事务管理如何适合这里。我的意思是Spring提供几个事务管理