多线程

本文深入探讨Java中多线程的实现方式,包括继承Thread、实现Runnable和Callable接口,以及使用线程池的最佳实践。详细讲解了线程的常用操作方法如sleep、yield和join,探讨了线程同步机制、死锁预防以及JDK1.6后的锁优化策略。同时,介绍了并发工具类如CountDownLatch、CyclicBarrier、Exchanger和Semaphore在多线程编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多线程
1 . 进程:操作系统中资源分配的最小单位
线程:进程中的独立任务,操作系统中任务调度的最小单位,依赖进程存在
在一个进程中线程共享资源。

2 . java中多线程实现
继承Thread
实现Runnable
实现Callable
线程池 — 推荐

3 . 常用操作方法
sleep():不释放对象锁,立即交出执行权
yield()(让步):交出cpu时间不确定,由系统调度决定,只会让拥有相同优先级的线程获取cpu 的机会,不释放对象锁。
join():线程等待,会释放对象锁
线程停止:
–设置标志位
–调用stop()方法
– 调用interrupt();

wait():
notify():

用户线程与守护线程

4 . 线程的同步与死锁
线程同步:synchronized(内建锁)–对象锁–管程
使用:
同步代码块:synchrinized(对象){//被保护的代码}
同步方法:
–普通方法:锁定当前对象this
public synchronized void test(){}
–静态方法:锁定当前类 .class

如何保护没有关联关系的多个资源? 不同的资源使用不同的锁即可。
保护有关联关系的多个资源 ? 静态

synchronized实现:对象的Monitor机制
可重入锁
JDK1.6之后的优化:
CAS
自适应自旋
偏向锁–默认–在任意时刻只有同一个线程在获取锁
轻量级锁 --在不同时间段有多个线程在获取锁
重量级锁–在同一时刻有多个线程在尝试获取锁

锁粗化:
锁消除:
死锁:共享资源上锁成环(银行家算法)

线程池:
1 . 推荐使用线程池原因:3
2 . 线程池的工作流程

juc包提供的关于并发的工具类

1 . CountDownLatch - 闭锁

public CountDownLatch(int count)

//调用await 方法的线程会一直阻塞
//直到CountDownLatch计数器值减为0才恢复执行
public void await()throw InterruptedException

//减去计数器值的方法
public void countDown()

2 . CyclicBarrier - 循环栅栏
//每个CylicBarrier的对象可以重复使用
//parties:子线程个数
public CyclicBarrier(int parties)

//所有调用await()方法阻塞的子线程在计数器值减为0后,随机挑选一个线程执行barrierAction任务后,所有子线程恢复执行
public CyclicBarrier(int parties,Runnable barrierAction)

//子线程调用await()方法后,将计数器值-1并进入阻塞状态
直到计数器值减为0时,所有调用await()阻塞的子线程再同时恢复执行
public void await()throw InterruptedException

3 . Exchanger - 线程数据交换器
一般用于俩个线程交换数据

首先调用exchange方法的线程会阻塞直到有新的线程进入Exchanger缓冲区,交换彼此线程数据再同时恢复执行

4 . Semaphore - 信号量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值