Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java在一个实例中同步了两个方法_Java_Multithreading_Synchronization - Fatal编程技术网

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()方法将等待对方完成

,这意味着当一个线程在增量()和减量()内时,其他线程将无法调用增量()和减量()。完整地说,其他线程无法执行此实例/对象的任何同步方法


您可以从同步方法调用任何其他同步方法,而不锁定同一实例/对象

是的,您扩展线程的想法是正确的,只是修复了代码:)