java synchronized (this) scope

12 浏览
0 Comments

java synchronized (this) scope

如果我在同一个Java类的两个函数中写synchronized(this),但这两个函数可能被两个线程调用,这段代码还能正常工作吗?

一些伪代码可能如下:

class A {
        public funA()
            synchronized (this) {
                // 在这里做一些事情;
            }
        }
        public funB() {
            synchronized (this) {
                // 在这里做其他事情;
            }
        }
}

还是我需要添加一个变量来实现?

0
0 Comments

这个问题的出现原因是在多个线程同时尝试进入使用synchronized关键字修饰的代码块时,只有一个线程能够成功进入,其他线程需要等待。具体是否能够正常工作取决于你想要实现什么样的效果。在这种情况下,当前进入synchronized代码块的线程被称为拥有该对象的监视器。

然而,这并不意味着其他线程不能在外部对该实例进行同步,从而阻止任何线程进入这些代码块。实际上,每个对象只有一个监视器。

为了解决这个问题,可以考虑以下几种方法:

1. 使用不同的监视器对象:可以创建一个新的对象作为监视器,而不是使用this关键字。这样,不同的线程就可以同时进入不同的synchronized代码块。

2. 使用不同的锁对象:可以使用不同的锁对象来代替synchronized关键字。例如,可以使用Lock接口的实现类来实现锁定和解锁操作。

3. 使用更细粒度的同步:如果可能的话,可以将代码块分成更小的部分,并只在需要同步的部分使用synchronized关键字。

通过采取上述方法,可以解决java synchronized (this) scope问题,并确保多个线程能够正确地访问和修改共享资源。

0
0 Comments

在代码中,线程被同步在this上。这意味着同一时间只有一个线程可以进入这个类(假设没有其他方法)。你没有对方法进行单独的同步。所以这可能会正常工作。尽管很难确定,因为我不知道你在方法中想做什么。并发总是棘手的。

上述代码中使用了synchronized (this)来对线程进行同步。这意味着只有一个线程可以访问该代码块,直到当前线程执行完毕。这种同步机制可以避免多个线程同时访问和修改共享数据时出现的竞态条件和数据不一致问题。

然而,使用synchronized (this)来同步整个类可能存在一些问题。首先,这种同步机制只能保证同一时间只有一个线程进入该类,但无法保证其他线程对类中其他方法的访问。如果有其他非同步方法同时被多个线程调用,可能会导致数据不一致的问题。

另外,使用synchronized (this)来同步整个类可能会导致性能上的问题。因为每个线程都必须等待前一个线程执行完毕才能进入该类,这样会导致线程的等待时间增加,从而影响程序的执行效率。

为了解决上述问题,可以考虑对需要同步的方法进行单独的同步。这样可以避免整个类被锁定,提高并发性能。可以使用synchronized关键字来修饰需要同步的方法,而不是整个类。这样只有在调用该方法时才会进行同步,而不是在整个类的范围内进行同步。

代码示例:

public synchronized void synchronizedMethod() {
    // 需要同步的代码块
}

通过对需要同步的方法进行单独的同步,可以提高程序的并发性能,并避免数据不一致的问题。然而,仍需谨慎使用同步机制,确保线程安全和程序正确性。

0