java并发编程专栏(九)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: java并发编程专栏(九)

21、CycliBarriar 和 CountdownLatch 都是 Java 并发编程中的线程同步工具。 CycliBarrier 用于创建一个计数器,在达到特定数值时将所有线程放在一起,从而等待直到下一个阶段。而 CountdownLatch 则是一种倒计时锁,允许线程等待其他线程执行某个操作后才开始执行。它们的主要区别在于,CountdownLatch 在达到一定阈值时会释放锁并唤醒所有等待的线程,而 CycliBarriar 则不会。

代码示例:

CycliBarriar barrier = new CycliBarriar();
for (int i = 0; i < 5; i++) {
    barrier.await(); // 所有线程等待计数器为 0
}

22、不可变对象是指一旦创建就无法被修改的对象,如 String、Integer、Boolean 等基本类型和一些包装类(如 ArrayList、HashMap 等)。

在写并发应用时,使用不可变对象可以提高性能和避免出现数据竞争的问题。因为如果一个对象被多个线程同时修改,那么就可能会发生数据错乱的情况。因此,使用不可变对象可以保证线程安全。

代码示例:

// 定义一个不可变对象
final int num = 0;

// 线程 A 修改 num 的值
Thread A = new Thread(() -> {
    num++;
});
A.start();

// 线程 B 修改 num 的值
Thread B = new Thread(() -> {
    num--;
});
B.start();

// 线程 C 修改 num 的值
Thread C = new Thread(() -> {
    num = 0;
});
C.start();

23、上下文切换是指操作系统或硬件将进程或线程从一个状态切换到另一个状态的过程。在多线程中,上下文切换通常指线程从阻塞状态切换到就绪状态或从就绪状态切换到运行状态。

Java 中的线程调度算法有多种,包括先来先服务、最短作业优先、轮转调度等。具体使用哪种算法取决于系统的硬件资源和应用程序的需求。

代码示例:

Thread[] threads = new Thread[3];
threads[0] = new Thread(() -> {
    System.out.println("Thread A is running");
    synchronized (this) {
        try {
            System.out.println("Thread A has waited");
            wait();
            System.out.println("Thread A has been notified");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

threads[1] = new Thread(() -> {
    System.out.println("Thread B is running");
    synchronized (this) {
        System.out.println("Thread B has waited");
        notify();
        System.out.println("Thread B has been notified");
    }
});

threads[2] = new Thread(() -> {
    System.out.println("Thread C is running");
    synchronized (this) {
        System.out.println("Thread C has waited");
        notifyAll();
        System.out.println("Thread C has been notified");
    }
});

for (Thread thread : threads) {
    thread.start();
}

24、线程组是一组相关联的线程的集合,每个线程都可以加入或退出线程组。在 Java 中,我们可以使用 ThreadGroup 类来创建和管理线程组。

代码示例:

 ThreadGroup group = new ThreadGroup("My Group");

group.setDaemon(true);

Thread t1 = new Thread(() -> {
    System.out.println("Thread 1 in the group");
});

Thread t2 = new Thread(() -> {
    System.out.println("Thread 2 in the group");
});

Thread t3 = new Thread(() -> {
    System.out.println("Thread 3 in the group");
});

group.addThread(t1);
group.addThread(t2);
group.addThread(t3);

for (Thread thread : group.getThreads()) {
    thread.start();
}

25、线程组是 Java 中的一种线程管理机制,它可以将一组相关的线程组织起来,方便管理和控制。但是,在实际开发中,不推荐使用线程组,因为它会增加线程之间的耦合度,使得程序更难以维护和调试。

代码示例:

ThreadGroup group = new ThreadGroup("My Group");

group.setDaemon(true);

Thread t1 = new Thread(() -> {
    System.out.println("Thread 1 in the group");
});

Thread t2 = new Thread(() -> {
    System.out.println("Thread 2 in the group");
});

Thread t3 = new Thread(() -> {
    System.out.println("Thread 3 in the group");
});

group.addThread(t1);
group.addThread(t2);
group.addThread(t3);

for (Thread thread : group.getThreads()) {
    thread.start();
}

26、Java 中有多种方式可以实现一个线程,其中最常见的方式是继承 Thread 类。

代码示例:

public class MyThread extends Thread {
    public void run() {
        System.out.println("Thread is running");
    }
}

MyThread t = new MyThread();
t.start();

27、在 Java 中,可以通过实现 Runnable 接口来创建一个线程。Runnable 接口只包含一个 run() 方法,该方法需要实现具体的业务逻辑。

代码示例:

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }
}

MyRunnable mr = new MyRunnable();
Thread t = new Thread(mr);
t.start();

28、Synchronized 是 Java 中的一种关键字,用于实现线程间的同步和互斥。当一个线程进入 synchronized 块时,它会获得一个锁,其他线程必须等待该线程释放锁之后才能进入 synchronized 块。

代码示例:

Object lock = new Object();

public void foo() {
    synchronized (lock) {
        System.out.println("Thread 1 is synchronized on " + lock);
    }

目录
相关文章
|
6天前
|
Java C++
关于《Java并发编程之线程池十八问》的补充内容
【6月更文挑战第6天】关于《Java并发编程之线程池十八问》的补充内容
27 5
|
1天前
|
存储 设计模式 前端开发
[笔记] 疯狂JAVA讲义(第3版)第12章 Swing编程
[笔记] 疯狂JAVA讲义(第3版)第12章 Swing编程
|
1天前
|
前端开发 Java 图形学
[笔记] 疯狂JAVA讲义(第3版)第11章 AWT编程
[笔记] 疯狂JAVA讲义(第3版)第11章 AWT编程
|
1天前
|
算法 安全 Java
什么是Java伪随机数,基础打牢。 #程序员 #Java #编程
什么是Java伪随机数,基础打牢。 #程序员 #Java #编程
6 0
|
2天前
|
Oracle Java 关系型数据库
JAVA入门: 编程环境安装
JAVA入门: 编程环境安装
|
2天前
|
XML Java 程序员
Java一分钟之-AOP:面向切面编程
【6月更文挑战第13天】Java中的AOP允许程序员定义切面,将日志、事务等通用功能与业务逻辑解耦。切面包括通知(Advice,如前置、后置等)和切入点(Pointcut,定义执行点)。Spring框架通过代理和@AspectJ注解支持AOP。常见问题包括代理对象理解错误、切入点表达式错误、环绕通知处理不当和配置遗漏。理解和实践中,AOP能提升代码可维护性和可扩展性。
20 5
|
2天前
|
分布式计算 自然语言处理 大数据
【大数据】MapReduce JAVA API编程实践及适用场景介绍
【大数据】MapReduce JAVA API编程实践及适用场景介绍
10 0
|
3天前
|
安全 Java
并发编程-Java如何实现原子操作(CAS或锁)
并发编程-Java如何实现原子操作(CAS或锁)
5 0
|
3天前
|
运维 监控 安全
Java一分钟之-Akka:反应式编程框架
【6月更文挑战第11天】Akka是Java开发者的并发利器,基于Actor模型,通过消息传递实现安全并发。核心组件包括Actor System、Actor、Message和Props。常见问题涉及Actor阻塞、死信与监控、错误消息处理。解决策略包括异步处理、死信监控、未处理消息管理。遵循明确消息契约、细粒度Actor、正确使用并发工具和监控日志等最佳实践,可助你有效避免陷阱,提升系统性能和可用性。开始你的Akka之旅,探索反应式编程新世界。
24 0
|
5天前
|
算法 Java 开发者
深入理解死锁的原因、表现形式以及解决方法,对于提高Java并发编程的效率和安全性具有重要意义
【6月更文挑战第10天】本文探讨了Java并发编程中的死锁问题,包括死锁的基本概念、产生原因和解决策略。死锁是因线程间争夺资源导致的互相等待现象,常由互斥、请求与保持、非剥夺和循环等待条件引起。常见死锁场景包括资源请求顺序不一致、循环等待等。解决死锁的方法包括避免嵌套锁、设置锁获取超时、规定锁顺序、检测与恢复死锁,以及使用高级并发工具。理解并防止死锁有助于提升Java并发编程的效率和系统稳定性。
18 0