使用synchronized 关键字、volatile、ReentrantLock 类与阻 操作系统原理 塞列队 LinkedBlockingQueue<E>几种同步方法,完成主线程与子线程的同步,写出实验小结
时间: 2024-02-11 11:06:54 浏览: 82
好的,我知道了。首先我需要解释一下 synchronized 关键字、volatile、ReentrantLock 类与阻塞队列 LinkedBlockingQueue<E> 的概念。
synchronized 关键字是 Java 中用于实现同步的关键字,可以用来修饰代码块、方法和静态方法,用于实现线程间的同步。
volatile 是一个关键字,用于修饰变量,用于实现多线程之间的可见性,即当一个线程修改了一个 volatile 变量的值时,其他线程可以立即看到这个修改。
ReentrantLock 类是一个可重入的互斥锁,可以用来实现线程间的同步,与 synchronized 关键字相比,ReentrantLock 提供了更多的功能,如公平锁和可中断锁等。
阻塞队列 LinkedBlockingQueue<E> 是一个基于链表实现的阻塞队列,在多线程编程中可以用来实现线程间的同步。
接下来,我将使用这些同步方法实现主线程与子线程的同步,并写出实验小结。
代码如下:
```
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.locks.ReentrantLock;
public class Main {
private volatile boolean flag = false;
private final ReentrantLock lock = new ReentrantLock();
private final LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
public static void main(String[] args) {
Main main = new Main();
main.start();
}
private void start() {
Thread t = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
lock.lock();
try {
queue.put(1);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
});
t.start();
lock.lock();
try {
while (!flag) {
Thread.sleep(100);
}
System.out.println(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
```
在这个例子中,主线程和子线程都需要修改和访问共享变量 flag,因此需要使用 volatile 关键字来实现可见性。
主线程需要等待子线程修改 flag 后才能继续执行,因此可以使用 while 循环不断检查 flag 是否被修改,这里使用了 Thread.sleep(100) 来减少 CPU 的占用率。
子线程需要将一个元素加入到队列中,并通知主线程可以继续执行,因此可以使用 ReentrantLock 和 LinkedBlockingQueue 来实现线程间的同步。
实验小结:
在多线程编程中,同步是一个非常重要的概念,可以用来避免线程间的竞争和冲突。在 Java 中,可以使用 synchronized 关键字、volatile、ReentrantLock 类和阻塞队列 LinkedBlockingQueue<E> 等方法来实现线程间的同步。在实际编程中,应根据情况选择不同的同步方法,以保证程序的正确性和效率。
阅读全文