• Java并发编程的艺术总结(1)


    1.线程上下文切换

    即使是单核cpu也能执行多线程代码,通过每个线程非配cpu时间片来实现,时间片是分配给线程的时间,时间一般几十毫秒,让我们感觉是多线程执行的

    2.多线程一定快么

    不一定,多线程涉及到线程的创建和上下文切换的开销

    3.如何减少上下文切换

    无锁并发编程:例数据i的id按hash算法取模,不同的线程处理不同段的数据

    cas算法:使用Java的Atomic包使用cas算法更新数据,不需要加锁

    使用最少线程:避免创建不需要的线程,任务很少,创建了大量的线程处理,会导致大量的线程处于等待状态

    协程:单线程实现多任务的调度,单线程维持多个任务的切换

    4.死锁

    1)死锁示例

    1. public class DeadlockTest {
    2. private static String A = "A";
    3. private static String B = "B";
    4. public static void main(String[] args) {
    5. new DeadlockTest().deadLock();
    6. }
    7. private void deadLock(){
    8. Thread t1 = new Thread(new Runnable() {
    9. @Override
    10. public void run() {
    11. synchronized (A) {
    12. try {
    13. Thread.currentThread().sleep(2000);
    14. } catch (InterruptedException e) {
    15. e.printStackTrace();
    16. }
    17. synchronized (B) {
    18. System.out.println("1");
    19. }
    20. }
    21. }
    22. });
    23. Thread t2 = new Thread(new Runnable() {
    24. @Override
    25. public void run() {
    26. synchronized (B) {
    27. synchronized (A) {
    28. System.out.println("2");
    29. }
    30. }
    31. }
    32. });
    33. t1.start();
    34. t2.start();
    35. }
    36. }

        2)避免死锁的常用方法

            避免一个线程同时获取多个锁

            避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用一个资源

            尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁

            对于数据库锁。加锁或解锁必须在一个数据库连接里,否则会出现解锁失败的情况

    5.资源限制的挑战

            1)什么是资源限制

            在进行并发编程时,程序的执行速度受限于计算机硬件或软件资源,如服务器带宽2mb/s,资源下载速度1md/s,系统启动10个线程,下载速度也不会变成10mb/s.

            2)资源限制的问题

            代码串行变成并行,如果受限于资源,仍然在串行执行的话反而更慢,增加了上下文切换和资源调度的时间。

            3)如何解决资源限制的问题

            集群并发执行,不同机器处理不同的数据

            4)资源限制的情况下并发编程

            根据不同资源限制程序的并发度,比如下载文件依赖带宽和硬盘读取速度,要根据带宽或硬盘读取速度限制使用的线程数,数据库操作涉及数据库连接数数,线程数比数据库连接数大很多,sql执行速度很快,那么线程会阻塞等待数据库连接,所以要根据资源来创建对应数量的线程。

  • 相关阅读:
    apache中的ab压测
    分析设备树文件
    混合SDN中的安全性问题研究
    基于AI的3DLUT系列论文分享
    mac知名的清理软件 cleanmymac和腾讯柠檬哪个好
    2023年传媒行业中期策略 AIGC从三个不同层次为内容产业赋能
    【汇编】指令系统的寻址方式
    设计模式:单例模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)
    Centos7 安装KVM
    显示器原理(1):CRT显示器
  • 原文地址:https://blog.csdn.net/qq_39482039/article/details/125920845