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
代码块。