Java 关键词 volatile synchronized

“volatile"和"synchronized"是Java中用来处理多线程编程的关键词。

  1. “volatile”:用于修饰变量。当一个变量被声明为volatile时,意味着它的值可能被多个线程同时修改,因此访问该变量时需要进行同步。“volatile"关键词确保变量的可见性和有序性,即一个线程对变量的修改对其他线程可见,并且不会发生指令重排序。但是,它不能保证原子性。也就是说,“volatile"修饰的变量在某个线程对其进行写操作之后,其他线程可以立即看到它的最新值。

  2. “synchronized”:用来实现线程之间的同步。它可以用来修饰方法或代码块。当方法或代码块被"synchrozied"修饰时,同一时刻只允许一个线程进入该方法或代码块,其他线程需要等待。这样可以避免多线程下的数据竞争和并发访问的问题。“synchronized"关键词提供了互斥访问的特性,但也会造成性能的损失。

这两个关键词都是用于处理多线程编程中的并发访问问题。“volatile"关键词主要用于保证变量的可见性和有序性,而"synchronized"关键词用于提供互斥访问机制,确保线程安全。

举例

volatile关键字

当使用volatile关键字时,一个经典的例子是多个线程共享一个变量来进行通信。下面是一个简单的示例:

public class SharedVariableExample {
    private volatile boolean flag = false;

    public void setFlag(boolean value) {
        flag = value;
    }

    public void doSomething() {
        while (!flag) {
            // 等待flag变为true
        }
        // 执行其他操作
    }
}

在这个例子中,有一个共享的boolean类型变量flag,并且该变量被声明为volatile。在doSomething()方法中,我们不断地检查flag的值,直到它变为true,然后才继续执行其他操作。volatile关键字确保了当一个线程修改了flag的值时,其他线程立即可以看到最新的值,从而实现了线程之间的可见性。

synchronized关键字

public class SynchronizedExample {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized void decrement() {
        count--;
    }

    public synchronized int getCount() {
        return count;
    }
}

在这个例子中,有一个共享的计数变量count,并且使用synchronized修饰了三个方法:increment()decrement()getCount()。这样,同一时刻只能有一个线程访问这些方法,避免了多线程下的数据竞争和不一致的问题。

这些例子展示了volatile和synchronized关键字在多线程编程中的使用。但是请注意,具体使用时需要根据具体的问题和需求来决定是否使用这些关键字以及如何使用。