下面我将详细讲解“Java多线程之线程同步七种方式代码示例”的攻略,包括背景知识、线程同步的七种方式及代码示例。
背景知识
在Java多线程编程中,多个线程访问共享资源时,可能会出现数据的不一致或者错误的情况,这就需要用到线程同步技术,即保证多个线程在对共享资源进行访问时的安全性。
七种方式
下面介绍七种常用的线程同步方式:
1、synchronized关键字实现同步
使用synchronized关键字修饰的方法或代码块,表示同一时间只能有一个线程访问该方法或代码块。
public synchronized void method() {
// ... // 线程同步代码
}
synchronized(object) {
// ... // 线程同步代码
}
2、Lock/ReentrantLock实现同步
利用Lock和ReentrantLock可以实现同步,Lock是一个接口,ReentrantLock是它的实现类,ReentrantLock使用起来比synchronized更加灵活。
Lock lock = new ReentrantLock();
lock.lock();
try {
// ... // 线程同步代码
} finally {
lock.unlock();
}
3、volatile关键字实现同步
volatile关键字可以强制线程在每次访问变量时都从内存中重新读取变量的值,而不是使用自己线程缓存中的变量副本。
public volatile int variable = 0; // 编译器将变量直接写入内存
4、wait/notify/notifyAll实现同步
wait/notify/notifyAll是Object类中的方法,需要结合synchronized关键字使用,wait能够让线程进入等待状态,直到被notify/notifyAll唤醒。
synchronized(object) {
while (condition1) {
object.wait();
}
// ... // 线程同步代码
object.notifyAll();
}
5、CountDownLatch实现同步
CountDownLatch是一种同步方式,它允许一个或多个线程等待其他线程完成操作。
CountDownLatch latch = new CountDownLatch(2);
new Thread(new Runnable() {
public void run() {
// ... // 线程同步代码
latch.countDown(); // 计数器减1
}
}).start();
latch.await(); // 使主线程等待两个子线程完成
6、CyclicBarrier实现同步
CyclicBarrier也是一种同步方式,它允许一组线程互相等待,直到所有线程都到达了一个公共的屏障点。
CyclicBarrier barrier = new CyclicBarrier(2, new Runnable() {
public void run() {
// ... // 线程同步代码
}
});
new Thread(new Runnable() {
public void run() {
// ... // 线程同步代码
barrier.await(); // 等待其他线程
}
}).start();
7、Semaphore实现同步
Semaphore是一种工具类,它维护了一组许可证,每次只允许信号量内的线程数目进行特定的操作。
Semaphore semaphore = new Semaphore(2);
new Thread(new Runnable() {
public void run() {
try {
semaphore.acquire(); // 获取许可证
// ... // 线程同步代码
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
semaphore.release(); // 释放许可证
}
}
}).start();
示例说明
示例1:利用synchronized关键字实现同步
public synchronized void increment() {
count++;
}
示例2:利用Lock/ReentrantLock实现同步
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++;
} finally {
lock.unlock();
}
}
以上就是关于Java多线程之线程同步七种方式代码示例的攻略,每种方式都有对应的示例讲解。希望可以帮助到您。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多线程之线程同步七种方式代码示例 - Python技术站