1.并发编程挑战

本文深入探讨了Java并发编程中的关键概念,包括上下文切换及其减少策略,如无锁并发编程和协程;死锁的避免方法,如避免同一线程获取多个锁;以及在资源限制下的并发编程实践。建议使用Java并发容器和工具类以优化并发性能。通过`jstack`命令可以分析线程状态,帮助诊断和解决问题。
摘要由CSDN通过智能技术生成

书行天下

(1)上下文切换

上下文切换:cpu通过时间片来执行任务,时间片结束后,需要切换线程。任务从保存到再加载的过程就是上下文切换。

上下文切换存在的问题:上下文切换存在时间的开销,因此线程个数对系统存在影响。

如何减少上下文切换:无锁并发编程、CAS算法、使用最少线程、协程。

  • 无锁并发编程 :多线程竞争锁存在线程切换,例如多线程处理数据时,将数据id经过hash算法取模分段到不同线程计算,避免使用锁。
  • CAS算法:比较、交换、自旋
  • 适当数量的线程
  • 协程:在单线程中实现多任务调度,并在单个线程中维持多个任务之间的切换。

    jstack命令dump线程信息命令:

jstack  21121 > /home/user/dump12.  #dump出文件
grep java.lang.Thread.State dump12 | awk '{print $2$3$4$5}' | sort | uniq -c.  #统计线程状态

#打开dump文件,查看不同状态线程都在做什么

(2)死锁

锁的使用可能会带来死锁,两个线程同时在等待对方释放锁就会引起死锁。

例如t1线程拿到锁后抛出异常没有释放锁导致其他线程无法获取锁。

如何避免死锁:

  • 避免同一个线程同时获取多个锁
  • 避免一个线程在锁内同时占用多个资源
  • 使用定时锁代替
  • 对于数据库锁,加/解锁必须在一个数据库连接里,否则会出现解锁失败。

(3)资源限制

如何在资源限制情况下并发编程:需要根据资源情况调整程序的并发度。

结论:使用java并发编程时,尽量使用java并发容器和工具类解决并发问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值