返回

代码的锁:如何在Java中使用synchronized

后端

什么是synchronized?

synchronized是Java中用于同步多线程的。它用于确保同一时刻只有一个线程可以访问共享资源。这可以防止数据损坏,例如当两个线程同时试图更新同一个变量时。

何时使用synchronized?

synchronized应该在以下情况下使用:

  • 多个线程访问共享资源时
  • 需要确保线程安全时
  • 需要防止数据损坏时

如何使用synchronized?

synchronized可以通过两种方式使用:

  • 在方法上使用synchronized:这种方法会对整个方法进行同步。
  • 在代码块上使用synchronized:这种方法只会对代码块进行同步。

示例代码

public class SynchronizedExample {

    private int count = 0;

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

    public int getCount() {
        return count;
    }

    public static void main(String[] args) {
        SynchronizedExample example = new SynchronizedExample();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                example.incrementCount();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                example.incrementCount();
            }
        });

        thread1.start();
        thread2.start();

        try {
            thread1.join();
            thread2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Final count: " + example.getCount());
    }
}

输出结果:

Final count: 2000

在这个示例中,我们创建了一个名为SynchronizedExample的类。这个类有一个名为count的私有变量,它存储着一个整数。我们还创建了两个方法:incrementCount()和getCount()。incrementCount()方法将count变量加1,而getCount()方法返回count变量的值。

我们在main方法中创建了一个SynchronizedExample对象,并创建了两个线程。每个线程都会调用incrementCount()方法1000次。我们使用join()方法来等待线程完成。

最后,我们打印出count变量的值。由于我们使用了synchronized关键字,因此我们可以确保两个线程不会同时访问count变量。这确保了count变量不会损坏,并且最终的值为2000。

结论

synchronized是Java中用于同步多线程的强大工具。它可以防止数据损坏,并确保线程安全。在本文中,我们介绍了synchronized的用法,何时使用synchronized,以及如何使用synchronized。我们还提供了一些使用synchronized的示例代码,以便您在自己的项目中使用它。