线程课程小结,以下内容部分来自网络,整理复习使用(太难啦啦┭┮﹏┭┮)
概述:
- 进程(Program):为了完成某个任务,完成某个功能而选择某个变成语言(例如:C语言、Java语言、Python等)编写的这组集合是以静态的方法存在与电脑等中。
- 进程(Process):程序的一次运行。
- 进程是操作系统分配资源的最小单位。同一个进程是共享同一份内存等资源,不同的进程之间不共享内存资源。
- 如果两个进程之间要进行数据交换,比较复杂,可以通过“文件”、网络通信等方式,成本高。
- 进程是操作系统分配资源的最小单位。同一个进程是共享同一份内存等资源,不同的进程之间不共享内存资源。
- 线程(Thread):当某个进程需要同时完成多个功能时,那么可以采用多线程。
- 线程是进程的其中一条执行路径。换句话说,一个进程至少有一个线程,还可以有多个线程
- 线程是CPU调度资源的最小单位。多个线程之间是共享内存,共享同一个进程的资源
- 因为CPU给每个线程分配到时间特别的短,所有用户感觉不到,感觉像是同时运行一样(宏观)
- JVM的运行时内存:方法区、堆、栈(虚拟机栈、本地方法栈)、程序计数器
- 堆:对象 --》实例变量,线程共享的
- 方法区:类的信息、常量、静态等 --》常量,静态变量线程共享的
- 栈:局部变量--》局部变量时每个线程独立的
JavaApplication:至少有一个main线程,但是后台(JVM)中还有一些其他线程,如:GC(垃圾回收)、异常的监视和处理的线程、类加载...
- 引用大佬的JVM图👇
使用
- 1、如何判断线程安全问题?
- 1)是否有多个线程使用同一个数据
- 2)并且有多条语句操作和方法这个共享数据
- 解决线程安全问题
- 1)synchronized关键字:同步方法、同步代码块
- synchronized修饰静态方法锁的是当前对象的.class对象;修饰普通方法锁的是当前对象(this)
- synchronized同步代码块可以锁任意类型的对象,使用共享数据的这些线程,只要使用同一个锁对象就可以了
- 2)Lock锁。什么是:独占锁、共享锁、公平锁 、非公平锁、重入锁、条件锁、读写锁!???emmm 没懂!以后慢慢研究
- 1)synchronized关键字:同步方法、同步代码块
- 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
- 这样设计的目的:实现对线程更细致的管理!
- 4、线程对象什么时候被gc回收
- 在就绪、运行、阻塞状态的线程不会被GC回收;新建的线程在没有被强引用的情况下会被GC回收;死亡的线程会被GC回收
- 注:JVM的GC是根据GC ROOT来判断一个对象是否为垃圾对象
- 线程在就绪、运行、阻塞状态下说明run()方法并没有弹出线程栈,并且run()方法中局部变量0的this对象还引用着该对象,所以在GC遍历判断中就会认为是可达对象
- 线程栈