JUC

本文深入探讨Java并发编程的关键概念,包括线程的六种状态、synchronized与lock的使用及区别、生产者和消费者问题的解决、以及线程池、阻塞队列等高级同步工具的运用。同时,解析了volatile关键字如何确保变量的可见性和禁止指令重排,以及Java内存模型的基础。

Volatile 

是java虚拟机提供轻量级的同步机制

 

线程6个状态

  1. new
  2. runnable
  3. blocked
  4. waiting
  5. timed_waiting
  6. terminated

Synchronized

锁 对象/class

lock

公平锁/非公平锁(默认)

区别:

Sync

线程之间的通信问题:生产者和消费者问题

wait(),notifyAll()

虚假唤醒

if改成while 

 

condition

await 等待

signal 唤醒

 

lock.lock()/lock.unlock()

1、锁的是方法的调用者(对象 ),先获取锁的先执行 

2、普通方法(没加锁)

 

Callable

  1. 可以有返回值
  2. 可以抛出异常
  3. 方法不同;call、run

线程启动的方式,有且仅有一个,就是 Thread.start

 

细节:

1、有缓存

2、会阻塞,结果需要等待

 

减法计数器:

countDownLatch.countDown();

countDownLatch.aWare();

 

加法计数器

Cyclicbarrier

 

信号量

Semaphore

 

readWriteLock 读写锁

独占锁、共享锁

写只能一个线程执行

读可以多个线程执行

 

BlockingQueue(队列的大小 )

阻塞队列

写入:满了

取:空

 

线程池

池化技术

程序的运行,本质:占用系统的资源!优化资源的使用

  1. 降低资源消耗
  2. 提高效率
  3. 方便管理 

线程复 用、控制并发数、管理线程

3大方法

Executor.newSingleThreadExcutor()单个线程

Excutors.newFixedThreadPool(5) 创建固定线程池大小

excutors.newCachedThreadPool() 可伸缩

7大参数

ThreadPoolExecutor 

 

拒绝策略

 

ForkJoin

 

JMM    java内存模型

volatile 是java虚拟机提供轻量级的同步机制

  1. 保证可见性
  2. 不保证原子性
  3. 禁止指令重排(内存屏障)

同步约定

  1.  线程解锁前,必须把共享变量立刻刷回内存
  2.  线程加锁前,必须读取主存中的最新值到工作内存
  3. 加锁和解锁是同一把锁

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

08-15
### JUC并发编程概述 Java Util Concurrent(JUC)包提供了大量的工具类来支持并发编程,使得开发者能够更好地管理和控制多线程环境下的任务执行。这些工具类主要集中在`java.util.concurrent`、`java.util.concurrent.atomic`以及`java.util.concurrent.locks`这三个包中。 ### Volatile关键字 `volatile`关键字在Java中用于确保变量的可见性和禁止指令重排序。当一个变量被声明为`volatile`时,它会确保该变量的修改能够立即对其他线程可见。例如,在下面的代码片段中,`flag`变量被声明为`volatile`以确保主线程对其修改能够被另一个线程及时看到: ```java public class TestJMM { private static volatile boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(() -> { while (flag) { } }).start(); System.out.println("停顿!"); TimeUnit.SECONDS.sleep(1); flag = false; System.out.println("修改完毕!"); } } ``` ### 原子性操作 在并发编程中,原子性操作是非常重要的概念。一个操作要么全部完成要么完全不执行,不会被其他操作中断。例如,`num++`不是一个原子性操作,因为它涉及读取、增加和写回三个步骤,这可能导致竞态条件。为了确保原子性,可以使用`AtomicInteger`类: ```java public class VDemo02 { private static AtomicInteger num = new AtomicInteger(0); public static void add() { num.incrementAndGet(); // 原子性操作 } public static void main(String[] args) { for (int i = 0; i < 20; i++) { new Thread(() -> { for (int i1 = 0; i1 < 1000; i1++) { add(); } }).start(); } while (Thread.activeCount() > 2) { Thread.yield(); } System.out.println(Thread.currentThread().getName() + " " + num); } } ``` ### 线程安全的数据结构 `ConcurrentHashMap`是Java并发编程中非常重要的一个线程安全的哈希表实现,它允许并发读和并发写,提供了比同步的`HashMap`更高的并发性能[^4]。 ### 线程池管理 利用`ExecutorService`可以方便地执行异步任务、管理线程池,并通过`Future`获取任务结果或取消任务。`ScheduledExecutorService`则适用于定时任务和周期任务的调度[^5]。 ### Lock锁机制 除了传统的`synchronized`关键字外,JUC还提供了更灵活的锁机制,如`ReentrantLock`,它可以提供尝试锁定、超时锁定等高级功能,从而更好地控制锁的行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值