Day22 多线程

1 多线程

1.1 程序 进程 线程

        程序 :一组命令的集合 程序是静态概念 通常存储于硬盘

        进程 : 正在运行的程序 动态概念保存在内存中 操作系统分配对应的PID

        我们关闭某个进程那么该进程在运行内存被销毁 

        线程: 一个程序中 不同的执行分支,如果同一个时间节点允许多个线程同时执行

        我们称之为支持多线程

        java中 main方法最开始执行 就是一个线程 称为主线程

1.2 并行和并发

        并行  多个CPU 同时执行多个任务

        并发   一个CPU 同时执行多个任务

        多线程并行 必须CPU大于一个

        单核CPU是没有多线程的

1.3 单核CPU 跟多核CPU

        单核CPU 假的多线程 通过时间片轮换来执行多个线程

        多核CPU 可以进行多线程

        一个java程序 java.exe 至少有三个线程 main()主线程 gc()垃圾回收线程 异常处理线程

1.4 多线程优缺点和应用场景

        应用场景 单核CPU在处理单个任务的时候执行速度比多核要快 因为不需要转换上下文环境

        程序需要 同时执行多个任务

        程序需要实现一些需要等待的任务 如用户文件读写等 如果一直等待单核就会阻塞在这里

        需要一些后台运行程序

优点       提高应用程序响应 图形化界面有意义 用户体验好

                提高对CPU利用率

                改善程序结构 利于理解跟修改

缺点         程序设计比较困难 需要考虑死锁等问题

                每个线程都会占用内存资源跟时间片 增加资源开销

                需要考虑安全问题

                

1.5 线程创建

        1 继承Thread类 覆写run方法 run方法相当于新线程的main方法

        2 实现Runnable接口 覆写run方法

        启动线程 通过该线程对象的start方法 然后改方法自动调用run方法

        不能直接调用run方法

1.5.1 Thread

        

1.5.2  Runnable

        

1.6 优先级跟常用方法‘

 1.6.1 概述

        

        注意 使用优先级的时候当内存资源紧缺的时候会体现出来       1.6.2 常用方法

         

1.6.3 使用

        

1.7 声明周期

        

1.8 线程控制

        

1.8.1 线程停止

        stop 停止该线程 但是可能出现死锁状态
 * 所以一般不是stop停止 而是采用标识符终止

        

1.8.2 线程合并 Join

        1.8.3 线程转让 Yield

        1.9 线程同步

 1.9.1 概述

        多个线程运行是不确定的 可能对数据造成不安全

        线程同步 当多个线程有可能同时操作同一个数据的时候为了保证数据的一致性

        需要进行同步执行

        异步编程 线程之间完全独立 没有相互影响

        同步编程 线程之间不是完全独立 相互可能有影响

        同步场景

                必须是多线程 必须有并发性

                多个线程有可能对同一个数据在同一个时间进行操作

                尤其是同时对数据进行更改操作 查询没事

1.9.2 解决方案

    

        1.9.2.1 方法锁

        synchroized 修饰方法

        

1.9.2.2 语句块锁

        当一个方法中只有部分代码需要同步的是 如果使用方法锁 会降低效率

        我们可以只对要加锁的代码块加锁即可

        synchroized 方法锁

        当某个线程访问某个对象中 加synchroized 修饰的成员方法时该对象所有加synchroized

修饰的成员方法全部锁定

        此时线程均不能访问synchroized修饰的成员方法需要排队 当上一个线程执行完方法的时候

交出锁 此时其他线程才能访问

        缺点 效率低 需要排队 而且整个对象中加锁的成员方法全部锁定

        优点 数据安全

synchroized(对象){}语句块锁

1.9.3  synchroized

         静态 也可以加锁 称为类锁
 *所有加锁的静态方法和静态语句块全部锁定synchroized(类名.class){}
 *成员 也可以加锁 称为对象锁
 *该对象中 所有加锁的成员方法和成员语句块锁全部锁定 Synchronized(对象){}
 *不同对象之间不会影响
 *类锁不会影响非静态方法跟未加锁的方法执行
 *对象锁不会影响非成员方法跟未加锁的方法执行 

1.10 Lock

        同步锁Lock

         每次只能有一个线程对Lock对象加锁 线程开始访问共享资源之前先获得Lock对象

1.10..1使用

               

1.10.2 优缺点

        缺点 Lock是显示锁需要手动开启关闭  synchroized是隐式锁自动开启关闭

        lock只有代码块锁

        优点 需要JVM花费较少的时间进行资源调度性能更好扩展性强

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值