江明涛的博客
Java synchronized 如何实现互斥和同步?
Java synchronized 如何实现互斥和同步?

Java synchronized 如何实现互斥和同步?

Java中的synchronized关键字是实现线程互斥和同步的重要工具。它可以用于方法和代码块,并提供了一种机制,确保在同一时间只有一个线程可以进入临界区域。
线程互斥是指同一时间只能有一个线程访问共享资源。在Java中,可以使用synchronized关键字来保证互斥性。当一个线程进入一个synchronized方法或代码块时,它会自动获取锁。其他线程则需要等待锁的释放才能继续执行。
下面是一个使用synchronized方法实现线程互斥的示例:
public class Counter {
    private int count;
    public synchronized void increment() {
        count++;
    }
}
在上面的代码中,increment()方法用synchronized关键字修饰,这意味着只有一个线程可以同时执行这个方法。当一个线程进入increment()方法时,它会锁定当前对象,其他线程必须等到锁被释放后才能执行。
除了使用synchronized方法,我们还可以使用synchronized代码块实现线程互斥。synchronized代码块允许我们显式地指定锁对象:
public class Counter {
    private int count;
    private Object lock = new Object();
    public void increment() {
        synchronized (lock) {
            count++;
        }
    }
}
在上述代码中,我们创建了一个名为lock的对象作为我们的锁。使用synchronized关键字来修饰代码块,并以lock对象作为参数,确保了互斥性。
除了实现互斥性,synchronized关键字还可以实现线程同步。线程同步是指多个线程之间的协调与合作,以保证数据的一致性。在Java中,可以使用synchronized关键字来实现线程同步。
下面是一个使用synchronized方法实现线程同步的示例:
public class PrintTask {
    public synchronized void printMessage(String message) {
        System.out.print("[");
        System.out.print(message);
        System.out.println("]");
    }
}
在上述代码中,printMessage()方法用synchronized关键字修饰,确保同一时间只有一个线程可以执行该方法。这样可以避免多个线程同时写入到标准输出流,导致输出混乱。
除了synchronized方法,我们还可以使用synchronized代码块实现线程同步。例如:
public class PrintTask {
    public void printMessage(String message) {
        synchronized (this) {
            System.out.print("[");
            System.out.print(message);
            System.out.println("]");
        }
    }
}
在上述代码中,我们使用this作为锁对象,确保同一时间只有一个线程可以执行synchronized代码块。
总结来说,Java的synchronized关键字可以实现线程互斥和同步。它提供了一种简单而有效的方式来保护共享资源的一致性。无论是使用synchronized方法还是synchronized代码块,都可以实现互斥和同步的效果。

上次更新时间 7 7 月, 2023 at 02:04 下午