硬件限制:带宽、硬盘读写速度、CPU的处理速度。 软件限制:数据库的连接数、socket的连接数等等。 应对策略:对于硬件限制,考虑集群并行执行程序,如Hadoop、服务器集群,不同机器处理不同数据。可以通过“数据ID%机器数”,计算得到一个机器的编号,然后由对应编号的机器处理这笔数据。对于软件限制,可以使用连接池和socket复用等管理连接数
多线程是为了利用现有资源让程序运行得更快
不是,因为多线程创建、上下文切换会影响执行速度。每个线程都有自己的Stack,java在64位系统默认Stack大小是1024KB
利用线程池
A、多线程竞争锁时,会引起上下文切换,可以采用三种方式避免锁的使用: ThreadLocal:单个线程独享数据 无锁并发编程:如将数据的ID按照Hash算法取模分段,不同线程处理不同段的数据 CAS算法:Java的Atomic包使用CAS算法来更新数据,而不需要加锁 B、根据硬件配置和任务量创建适量线程 C、协程(coroutine):在单线程里实现多个任务的调度,并在单线程里维持多个任务间的切换
jstack pid > /home/dump20170307 grep /home/dump20170307 | awk ‘{PRint
注意:Runnable被包含到Running中
线程间互相等待彼此持有的锁会产生死锁,通过jstack可以方便排查 避免一个线程中同时获取多个锁 避免一个线程的锁内同时占有多个资源 尝试使用定时锁tryLock(timeout)
新闻热点
疑难解答