当前位置: 首页 > article >正文

同步与并发:Java的同步舞蹈

现在,我们将深入探讨同步与并发,这是确保多线程程序正确性和效率的关键,就像是Java的同步舞蹈。

1 并发的概念

并发是指在多处理器系统中,多个操作或多个线程同时进行执行。在Java中,这意味着能够有效地利用多核处理器资源,提高程序性能。

2 线程间的通信

线程间的通信主要依靠共享内存,而同步机制确保了线程在访问共享资源时的一致性和线程安全。

3 同步方法

在Java中,可以通过synchronized关键字来同步方法,确保一次只有一个线程可以执行该方法。

示例代码

 
public class SynchronizedMethod {
    public synchronized void doWork() {
        // 仅允许一个线程同时执行这个方法
    }
}

4 同步块

同步块提供了更细粒度的控制,允许只同步代码的一部分。

示例代码

 
public class SynchronizedBlock {
    private final Object lock = new Object();

    public void doWork() {
        synchronized (lock) {
            // 仅允许一个线程同时执行括号内的代码
        }
    }
}

5 可见性

可见性是指一个线程对共享变量的修改能够被其他线程看到。在Java中,volatile关键字可以保证变量的可见性。

示例代码

 
public class Visibility {
    private volatile boolean active = true;

    public void stop() {
        active = false;
    }

    public void doWork() {
        while (active) {
            // 工作代码
        }
    }
}

6 死锁

死锁发生在两个或多个线程相互等待对方释放资源,导致程序无法继续执行。避免死锁是并发编程中的一个挑战。

7 避免死锁的策略

  • 锁定顺序:总是以相同的顺序获取锁。

  • 锁定超时:尝试获取锁时使用超时。

  • 死锁检测:周期性地检查死锁并手动解决。

8 并发工具

Java的java.util.concurrent包提供了多种并发工具,如CountDownLatchCyclicBarrierSemaphore等,这些工具帮助程序员更容易地处理复杂的并发问题。

示例代码(CountDownLatch)

 
import java.util.concurrent.CountDownLatch;

public class LatchExample {
    public static void main(String[] args) throws InterruptedException {
        final int totalThreads = 5;
        CountDownLatch latch = new CountDownLatch(totalThreads);

        for (int i = 0; i < totalThreads; i++) {
            new Thread(new Worker(latch)).start();
        }

        latch.await(); // 等待所有线程完成
        System.out.println("All threads have finished execution");
    }

    static class Worker implements Runnable {
        private final CountDownLatch latch;

        public Worker(CountDownLatch latch) {
            this.latch = latch;
        }

        @Override
        public void run() {
            try {
                // 执行工作
            } finally {
                latch.countDown(); // 完成时计数减一
            }
        }
    }
}

9 并发集合

java.util.concurrent包还提供了线程安全的并发集合,如ConcurrentHashMapCopyOnWriteArrayList等,它们为并发程序提供了高效的数据结构。

示例代码(ConcurrentHashMap

 
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentMapExample {
    private static ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();

    public static void main(String[] args) {
        map.put(1, "One");
        map.put(2, "Two");

        // 可以安全地由多个线程访问和修改
    }
}

通过这一节的学习,你现在应该对Java中的同步与并发有了深入的理解。同步与并发是确保多线程程序正确性和效率的关键,它们允许程序在多核处理器上高效运行。掌握这些概念,可以帮助你编写出既正确又高效的并发程序。下一节,我们将探讨线程池与并发工具,这是Java的分身管理器,用于管理线程的创建和执行。


http://www.kler.cn/a/469797.html

相关文章:

  • 装修房子,你会选购灯和搭配灯光吗?
  • Electron使用记录
  • 批量写入数据到数据库,卡顿怎么解决
  • python requests 415
  • 数据挖掘——数据预处理
  • 物联网:七天构建一个闭环的物联网DEMO
  • 修改 Redis 中键的字段值:string和hash类型的区别
  • DevSecOps:在不断变化的威胁环境中加强移动应用安全
  • GESP2023年12月认证C++五级( 第三部分编程题(1)小杨的幸运数)
  • leetcode739.每日温度
  • C++二十三种设计模式之原型模式
  • 浏览器解析过程
  • Python中超过15位小数的高精度计算
  • springCloudGateWay使用总结
  • 【操作系统】课程 4调度与死锁 同步测练 章节测验
  • C语言:枚举类型
  • Markdown编辑器——Typora(Picgo+Github图床)
  • 【归一化】RMSNorm
  • 并发安全问题解析
  • 内核链表 例题 C语言实现
  • Qt——网络编程
  • 网络协议安全的攻击手法
  • 如何进行千万级别数据跑批优化
  • GitHub 基础使用指南
  • Go语言的 的数据封装(Data Encapsulation)核心知识
  • 深入了解 ES6 Map:用法与实践