Java synchronized代码块

概述

在多线程编程中,如果多个线程同时访问共享资源,可能会导致数据不一致或产生其他问题。为了保证线程安全,Java提供了synchronized关键字来控制对共享资源的访问。

synchronized关键字可以用于修饰方法或代码块,用来实现同步访问共享资源。本文将重点介绍synchronized代码块的使用。

代码示例

下面是一个简单的示例,演示了synchronized代码块的使用:

public class Counter {
    private int count;

    public Counter() {
        count = 0;
    }

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

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

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

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

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

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

        thread1.join();
        thread2.join();

        System.out.println(counter.getCount());
    }
}

上面的代码定义了一个Counter类,其中包含一个count变量,用来表示计数器的值。increment方法和getCount方法都使用了synchronized代码块,确保了对count变量的访问是同步的。

Main类的main方法中,创建了两个线程,分别对计数器进行增加操作。最后,通过调用counter.getCount()方法获取计数器的值,并打印出来。

流程图

下面是synchronized代码块的流程图:

flowchart TD
A(线程1) --> B{synchronized (this)}
B --> C(count++)
C --> D{结束}
D --> E(线程1)

A --> F(线程2)
F --> G{synchronized (this)}
G --> H(count++)
H --> I{结束}
I --> J(线程2)

流程图中,线程1和线程2分别通过synchronized (this)进入临界区(synchronized代码块),执行相应的操作后离开。这样可以确保每次只有一个线程对共享资源进行访问,避免了线程安全问题。

关系图

下面是Counter类的关系图:

erDiagram
    Counter {
        int count
    }

关系图中,Counter类拥有一个count属性,用来表示计数器的值。

总结

通过使用synchronized关键字修饰代码块,可以保证多个线程对共享资源的访问是同步的,避免了线程安全问题。本文介绍了synchronized代码块的基本用法,并给出了示例代码和流程图、关系图的说明。希望能帮助读者理解和使用synchronized代码块。