java并发编程(1)

什么是并发编程?
并发编程就是多个线程一起执行某个任务或逻辑。如果把一个线程比作一个工人的话,就是多个工人同时做某项工作。以提高效率。
并发一定快吗?
按照正常工人干活的例子来说,在每个工人效率相同的情况下,多个工人的速度很定大于一个工人的速度。但是在计算机并发处理时并不一定比单线程处理快,原因如下:
1、多线程之间是需要获取CPU的时间片才能工作的。当线程1用完了本次分配的时间片,就会停止工作并保存当前的工作状态,然后获得了时间片的线程2开始执行。(对于单核CPU同一时刻只有一个线程在执行),直到线程1再次获得时间片才能加载上次停止时的工作状态继续工作。这样每次保存和加载工作状态会消耗一定的资源。影响执行效率。所以对于简单的任务计算量不大的任务使用多线程由于增加了状态切换的资源消耗所以效率有可能不如单线程高。
2、如果任务中会访问受限制的资源,比如下载文件 速度固定1M/s ,在达到这个限制后即使在增加更多的线程,也无法提高效率。反而因为很多线程的状态切换浪费资源,降低效率。类似的情况还有 io 等
3、多线程下情况复杂,如果不小心可能会造成死锁等人为问题。
如何尽可能提高并发效率?
尽量减少上下文切换 和线程阻塞 具体方法
1)尽可能使用无锁并发编程 比如通过hash取模将数据分批并发处理,避免由于访问共享资源造成的阻塞
2)通过CAS算法避免 线程阻塞
3)使用适量的线程,比如下载带宽最大为1M每秒,每个线程下载速度为 300K/s 那么可以只启动3-4 个线程。
4)锁粗化 比如使用 synchronized 关键字时 有很多小段的 代码需要同步,可以将这些代码合并成一个同步代码段,避免线程为了不断获得锁频繁进行状态切换

如何避免死锁:
1、尝试使用粗锁 一次性获取所有资源
2、顺序加锁 避免循环等待锁的情况
3、如果已经获取到一个锁,同时再次尝试获取第二个锁的时候 超过指定时间获取不成功就 暂时主动释放自己持有的锁。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

catch that elf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值