学习Java多线程之同步,首先需要明确什么是同步。同步是指在多个线程并发执行时,保证多个线程对共享资源的安全访问。下面是一个完整攻略,希望对您有所帮助。
目录
- 理解同步概念
- 实现同步
理解同步概念
在多线程环境下,由于线程的执行顺序不是我们能控制的,如果多个线程同时访问共享资源,可能会导致不可预料的行为。比如,每个线程都想更改同一个变量的值,那么变量的最终值可能会变得不可预测。
因此,需要通过同步来保证多个线程对共享资源的安全访问。Java提供了synchronized关键字和Lock接口来实现同步。
实现同步
使用synchronized关键字
synchronized关键字可以用在方法或代码块中,它会保证同一时间只有一个线程可以进入synchronized块并访问其中的共享资源。下面是一个实现同步的示例:
public class SyncExample {
private int count = 0;
public synchronized void increment() {
count++;
}
public void work() {
Thread t1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 1000; i++) {
increment();
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 1000; i++) {
increment();
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Count is: " + count);
}
}
上述代码中,increment方法使用了synchronized关键字,保证了访问count变量的同步性。t1和t2是两个线程,它们都会访问SyncExample对象的increment方法,但由于increment方法被synchronized修饰,所以每次只有一个线程可以进入increment方法实现对count变量的加1操作,保证了线程安全。
使用Lock接口
除了synchronized关键字之外,Java还提供了Lock接口实现同步。下面是一个使用Lock接口实现同步的示例:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockExample {
private int count = 0;
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
public void work() {
Thread t1 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 1000; i++) {
increment();
}
}
});
Thread t2 = new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 1000; i++) {
increment();
}
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Count is: " + count);
}
}
上述代码中,increment方法使用了Lock接口实现同步,保证了访问count变量的同步性。lock是一个Lock接口的实例,它保证了只有一个线程可以进入increment方法实现对count变量的加1操作,保证了线程安全。
在Java中实现同步有多种方式,本文介绍了两种常见的方式:使用synchronized关键字和Lock接口,它们都可以保证对共享资源线程安全的访问。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:学习Java多线程之同步 - Python技术站