初识多线程

本文探讨了资源限制类型及应对策略,分析了多线程的优势与挑战,并提出了线程池、ThreadLocal等优化手段。

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

0. 资源限制有哪些?

硬件限制:带宽、硬盘读写速度、CPU的处理速度。
软件限制:数据库的连接数、socket的连接数等等。
应对策略:对于硬件限制,考虑集群并行执行程序,如Hadoop、服务器集群,不同机器处理不同数据。可以通过“数据ID%机器数”,计算得到一个机器的编号,然后由对应编号的机器处理这笔数据。对于软件限制,可以使用连接池和socket复用等管理连接数

1. 为啥要用多线程?

多线程是为了利用现有资源让程序运行得更快

2. 线程越多越快吗?

不是,因为多线程创建、上下文切换会影响执行速度。每个线程都有自己的Stack,Java在64位系统默认Stack大小是1024KB

3.如何减少线程的创建?

利用线程池

4.如何减少上下文切换?

A、多线程竞争锁时,会引起上下文切换,可以采用三种方式避免锁的使用:
ThreadLocal:单个线程独享数据
无锁并发编程:如将数据的ID按照Hash算法取模分段,不同线程处理不同段的数据
CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁
B、根据硬件配置和任务量创建适量线程
C、协程(coroutine):在单线程里实现多个任务的调度,并在单线程里维持多个任务间的切换

5.观察线程状态命令

jstack pid > /home/dump20170307
grep /home/dump20170307 | awk ‘{print 2345}’ | sort | uniq -c

6.线程的几种状态

注意Runnable被包含到Running中

线程状态

7.死锁

线程间互相等待彼此持有的锁会产生死锁,通过jstack可以方便排查
避免一个线程中同时获取多个锁
避免一个线程的锁内同时占有多个资源
尝试使用定时锁tryLock(timeout)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值