Java在一个实例中同步了两个方法
考虑以下代码:Java在一个实例中同步了两个方法,java,multithreading,synchronization,Java,Multithreading,Synchronization,考虑以下代码: public class SynchronizedCounter extends Thread { private int c = 0; public synchronized void increment() { c++; } public synchronized void decrement() { c--; } public void run() { for(;;)
public class SynchronizedCounter extends Thread {
private int c = 0;
public synchronized void increment() {
c++;
}
public synchronized void decrement() {
c--;
}
public void run() {
for(;;)
increment();
}
}
static void main(String[] args) {
SynchronizedCounter counter = new SynchronizedCounter();
counter.start();
for(;;)
counter.decrement();
}
这是否意味着increment()和decrement()方法将等待对方完成
编辑:
这不是等待吗
static void main(String[] args) {
SynchronizedCounter counter1 = new SynchronizedCounter();
SynchronizedCounter counter2 = new SynchronizedCounter();
counter1.start();
for(;;)
counter2.decrement();
}
是的,
synchronized
关键字是以下内容的简写:
synchronized(this) {
//...
}
因此,这两种方法都有效地锁定了同一个互斥对象。如果希望它们彼此独立(在本例中这是个坏主意,因为它们都访问相同的值),请参阅
顺便说一句,你的
SynchronizedCounter
应该实现Runnable
,而不是扩展线程
,因为你正在将它传递给其他线程的构造函数-现在有点混乱。锁总是在整个对象上。如果其中任何一个是同步的,则访问成员
在第一个示例中,有两个线程争夺相同的计数器
对象,一个线程是显式启动的(在无限循环中调用increment()
方法),另一个线程是主线程(无限调用decrement()
)
在第二个示例中,创建了两个对象counter1
和counter2
。它们将拥有各自独立的锁。锁定一个对象不会影响其他线程访问其他对象。两个线程(显式线程和主线程)在两个不同的对象上获得锁,因此没有争用 这是否意味着increment()和decrement()方法将等待对方完成
否,这意味着当一个线程在增量()和减量()内时,其他线程将无法调用增量()和减量()。完整地说,其他线程无法执行此实例/对象的任何同步方法
您可以从同步方法调用任何其他同步方法,而不锁定同一实例/对象是的,您扩展线程的想法是正确的,只是修复了代码:)