JavaSE 学习基础之线程课程小结

分享 兰兰的海豚 ⋅ 于 2020-06-24 09:36:14 ⋅ 最后回复由 兰兰的海豚 2020-06-26 18:56:54 ⋅ 2218 阅读

线程课程小结,以下内容部分来自网络,整理复习使用(太难啦啦┭┮﹏┭┮)

概述:

  • 进程(Program):为了完成某个任务,完成某个功能而选择某个变成语言(例如:C语言、Java语言、Python等)编写的这组集合是以静态的方法存在与电脑等中。
  • 进程(Process):程序的一次运行。
    • 进程是操作系统分配资源的最小单位。同一个进程是共享同一份内存等资源,不同的进程之间不共享内存资源。
      • 如果两个进程之间要进行数据交换,比较复杂,可以通过“文件”、网络通信等方式,成本高。
  • 线程(Thread):当某个进程需要同时完成多个功能时,那么可以采用多线程。
    • 线程是进程的其中一条执行路径。换句话说,一个进程至少有一个线程,还可以有多个线程
    • 线程是CPU调度资源的最小单位。多个线程之间是共享内存,共享同一个进程的资源
    • 因为CPU给每个线程分配到时间特别的短,所有用户感觉不到,感觉像是同时运行一样(宏观)
  • JVM的运行时内存:方法区、堆、栈(虚拟机栈、本地方法栈)、程序计数器
    • 堆:对象 --》实例变量,线程共享的
    • 方法区:类的信息、常量、静态等 --》常量,静态变量线程共享的
    • 栈:局部变量--》局部变量时每个线程独立的

JavaApplication:至少有一个main线程,但是后台(JVM)中还有一些其他线程,如:GC(垃圾回收)、异常的监视和处理的线程、类加载...

  • 引用大佬的JVM图👇
    file

    使用

  • 1、如何判断线程安全问题?
    • 1)是否有多个线程使用同一个数据
    • 2)并且有多条语句操作和方法这个共享数据
  • 解决线程安全问题
    • 1)synchronized关键字:同步方法、同步代码块
      • synchronized修饰静态方法锁的是当前对象的.class对象;修饰普通方法锁的是当前对象(this)
      • synchronized同步代码块可以锁任意类型的对象,使用共享数据的这些线程,只要使用同一个锁对象就可以了
    • 2)Lock锁。什么是:独占锁、共享锁、公平锁 、非公平锁、重入锁、条件锁、读写锁!???emmm 没懂!以后慢慢研究
  • 2、线程池,emmm慢慢研究
  • 3、我们都知道在调用Object.wait()时必须在synchronized块里面,否则会抛出 IllegalMonitorStateException。但是为什么会有该限制,为什么wait()和notify()同时出现才有意义?为什么wait()和notify()需要搭配synchronized关键字使用??

    • 引用大佬CSDN
    • 答:synchronized的含义:
      • Java中每一个对象都可以成为一个监视器(Monitor),该Monitor由一个锁(lock),一个等待队列(waiting queue),一个入口队列(entry queue)
      • 对于一个对象的方法,如果没有synchronized关键字,该方法可以被任意数量的线程在任何时刻调用
      • synchronized用于实现多线程的同步操作
    • wait()作用
      • wait(),notify(),notifyAll()和synchronized需要搭配使用,用于线程同步
      • wait()总是在一个循环中被调用,挂起当前线程来等待一个条件的成立。wait()调用会一直等到其他线程调用notifyAll()时才会返回
      • 当一个线程在执行synchronized的方法内部,调用了wait()后,该线程会释放该对象的锁,然后该线程会被添加到该对象的等待队列中(waiting queue),只要该线程在等待队列中,就会一直处于闲置状态,不会被调度执行。
      • 要注意wait()方法会强迫线程先进行释放锁操作,所有在调用wait()时,该线程必须已经获得锁,否则会抛出异常。由于wait()在synchronized的方法内部被执行,所以锁一定以后获得了,就不会抛出异常。
    • Monitor
      file
    • 这样设计的目的:实现对线程更细致的管理!
  • 4、线程对象什么时候被gc回收
    file
    • 在就绪、运行、阻塞状态的线程不会被GC回收;新建的线程在没有被强引用的情况下会被GC回收;死亡的线程会被GC回收
    • 注:JVM的GC是根据GC ROOT来判断一个对象是否为垃圾对象
    • 线程在就绪、运行、阻塞状态下说明run()方法并没有弹出线程栈,并且run()方法中局部变量0的this对象还引用着该对象,所以在GC遍历判断中就会认为是可达对象
    • 线程栈
      file
版权声明:原创作品,允许转载,转载时务必以超链接的形式表明出处和作者信息。否则将追究法律责任。来自海汼部落-兰兰的海豚,http://hainiubl.com/topics/75157
成为第一个点赞的人吧 :bowtie:
回复数量: 5
  • 青牛 海汼部落创始人,80后程序员一枚,曾就职于金山,喜欢倒腾技术做产品
    2020-06-24 09:46:07

    good,上传一下打赏码。

  • 兰兰的海豚
    2020-06-24 23:55:11

    @青牛 哇 我的天呢!青牛老师好 emmm (紧张⊙﹏⊙∥)

  • 青牛 海汼部落创始人,80后程序员一枚,曾就职于金山,喜欢倒腾技术做产品
    2020-06-25 00:31:41

    @谭海棠 不用紧张,格式工整值得奖励,养成总结的良好习惯对于以后复习的时候是十分有帮助的。另外有个建议代码部分不用贴图用编辑器的插入代码功能就可以了。快把码放出来吧。

  • 青牛 海汼部落创始人,80后程序员一枚,曾就职于金山,喜欢倒腾技术做产品
    2020-06-25 00:34:45

    @谭海棠 等以后学了python和scala的线程的时候再回头来照这个笔记对比一下java的线程

  • 兰兰的海豚
    2020-06-26 18:56:54

    @青牛 收到!谢谢老师,我会努力的!(ง •_•)ง

暂无评论~~
  • 请注意单词拼写,以及中英文排版,参考此页
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`, 更多语法请见这里 Markdown 语法
  • 支持表情,可用Emoji的自动补全, 在输入的时候只需要 ":" 就可以自动提示了 :metal: :point_right: 表情列表 :star: :sparkles:
  • 上传图片, 支持拖拽和剪切板黏贴上传, 格式限制 - jpg, png, gif,教程
  • 发布框支持本地存储功能,会在内容变更时保存,「提交」按钮点击时清空
Ctrl+Enter