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 23
6.线程的几种状态
注意:Runnable被包含到Running中
7.死锁
线程间互相等待彼此持有的锁会产生死锁,通过jstack可以方便排查
避免一个线程中同时获取多个锁
避免一个线程的锁内同时占有多个资源
尝试使用定时锁tryLock(timeout)