java线程或多线程相关概念详解以及优化方案

1. 何为线程
    是程序运行的基本执行单元,是进程中的实际运作单位,是轻量级的子进程;

2. 何为线程并发
    程序启动多个线程并发执行;

3. 何为主线程
    当jvm启动之后,加载类文件,发现main方法,就会为main方法创建一个线程,用于方法的执行,这个线程称之为主线程;   

4. 何为线程安全和不安全
    (1)当多个线程同时执行操作共享数据时,就有可能会产生不一样的数据结果,这就是所谓的线程不安全;
    (2)当多线程和单线程同时执行程序,而最终的结果永远都是一样,这就是线程安全;    

5. 何为多线程
    为了更好利用cpu的资源,同时不阻塞线程的执行,程序可以开启多个线程一起执行其他任务,这就是多线程;    

6. 何为线程池
    频繁创建和销毁线程是非常消耗内存资源的,所以就衍生了线程池的概念,用于管理提前建好的多个线程,程序
    需要的时候可以直接使用,提高线程的复用性和系统性能;    

7. 何为线程的生命周期
    (1)创建(实现线程);
    (2)就绪(启动start);
    (3)运行(运行run方法);
    (4)等待/阻塞/睡眠(wait/join/sleep);
    (5)终止(run方法stop或者其他异常终止);

8. 何为线程死锁
    程序运行时多个线程同时阻塞,其中的一个或全部线程等待某个资源释放,而改资源又被其他线程锁定,从而导致每个线程都在等待其他线程释放资源,都无法结束,这就造成了线程的死锁;

 9. 何为线程同步

  • 为了解决线程不安全问题,需对线程进行同步,即多个线程只能对一个共享资源进行更改,不可对私有数据进行更改;
  • 线程同步的几种方式:

    (1)使用synchornized关键字修饰方法,添加同步锁;
    (2)使用关键字volatile修饰共享变量实现伪同步;
    (3)使用重入锁实现线程同步,即使用类ReentrantLock类来定义锁,其中lock()方法为打开锁,unlock()方法为关闭锁,注意及时释放锁,不然会进入死锁状态;    

10. 线程的sleep、wait、join
    (1)sleep和wait都会暂停线程,join则一般用于控制线程之间的先后顺序;
    (2)sleep不会释放同步锁,而wait会释放同步锁;

11. 线程的start和run方法
    (1)start()方法会启动新的线程,这时线程处于就绪状态,但还没开始运行,获取到cpu的时间片之后,就会开始执行run方法,这里的run方法称之为线程体,run运行结束,则线程终止;
    (2)run方法属于thread类的一个普通方法的调用,在主线程里面执行,不会开启新线程;
    (3)run方法包含在start方法里面;

12. 如何解决多线程中的高并发
    线程高并发是多线程并发处理中必须会遇到的一个问题,这里分享一下博主的相关解决思路:
    (1)高并发为何会产生问题?
        当n个线程同时抢占共享资源数据的时候,如果不进行线程同步,则很难绝对保证线程安全问题,出现诸多问题,例如计算结果数据不一致、线程死锁、数据库死锁等
    (2)高并发优化解决总体方案?
        一方面是保证线程的同步性(限流);另一方面保证任务的执行效率(减压以及提高质量)
    (3)优化细节?
        同步性方面:synchornized、volatile、ReentrantLock等;
        执行效率方面:
            代码层:redis等缓存策略;线程池降低资源损耗;减少事务开启,合并事务单元等;
            项目逻辑层:业务分块,减轻压力;分布式微服务项目部署;负载均衡策略等;
            数据库层:数据集群;分库分表;读写分离策略;使用搜索引擎等优化工具等;

发布了79 篇原创文章 · 获赞 276 · 访问量 57万+

猜你喜欢

转载自blog.csdn.net/alan_liuyue/article/details/105100400