Java多线程同步问题:锁、信号量等使用

原创 红太狼 2024-12-01 18:30 151阅读 0赞

在Java中,多线程的同步主要是通过两种机制实现的:锁(Lock)和信号量(Semaphore)。

  1. 锁:
  • synchronized关键字:这是最常用的锁,用于同步一个方法或代码块。例如:

    1. public class Counter {
    2. private int count = 0;
    3. public synchronized void increment() {
    4. count++;
    5. }
    6. public synchronized int decrement() {
    7. if (count > 0) {
    8. count--;
    9. return count;
    10. }
    11. throw new IllegalStateException("Counter underflow");
    12. }
    13. // Getter
    14. public synchronized int getCount() {
    15. return count;
    16. }
    17. }
  1. 信号量:
  • Semaphore类:它类似于锁,但可以控制同时访问资源的线程数。例如:
    ```java
    import java.util.concurrent.Semaphore;

public class SemaphoreExample {
private Semaphore semaphore = new Semaphore(1);

  1. public void criticalSection() {
  2. semaphore.acquire(); // 请求信号量
  3. try {
  4. // 执行临界区操作
  5. System.out.println("Critical Section executing...");
  6. } finally {
  7. // 无论是否执行临界区操作,都需要释放信号量
  8. semaphore.release();
  9. }
  10. }
  11. public static void main(String[] args) {
  12. SemaphoreExample example = new SemaphoreExample();
  13. new Thread(() -> {
  14. try {
  15. example.criticalSection(); // 进入临界区
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. })).start();
  20. try {
  21. // 主线程在此等待进入临界区的线程执行完毕
  22. example.criticalSection(); // 重复尝试进入临界区,但因为已经被其他线程占用,所以会阻塞直到前面的线程释放。
  23. } catch (InterruptedException e) {
  24. e.printStackTrace();
  25. }
  26. }

}
```
以上就是Java中使用锁(synchronized关键字)和信号量(Semaphore类)进行多线程同步的基本方式。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,151人围观)

还没有评论,来说两句吧...

相关阅读