1 스레드와 프로세스의 차이
프로세스와 스레드 :이 프로그램은 기존의 컴퓨터 운영 체제에 대해 개별적으로 실행할 수 있습니다, 프로세스는 자원 할당 및 기본 단위의 일정하지만, 각 시간은있을 것이다 전환의 다른 프로세스에 대한 운영 체제 또는 소프트웨어 데이터 복구 및 새로운 데이터의 재배포, 그래서 개선 할 수있는이 상황에 대한 기존의 컴퓨터 운영 체제, 그래서 컴퓨터의 운영 체제가 자원 할당의 기본 단위로 단지 과정입니다 순간, 및 실행 및 스케줄링의 스레드로 기본 단위, 프로그램 자원 각 스레드 스케줄링 및 실행은 매우 작은 메모리 풋 프린트, 낮은 오버 헤드하여 증가하기 때문에 , CPU 처리 능력을
요약하면 :
코드 세그먼트의 부분은 개별적으로 수행 될 수있다 : 스레드
프로세스 : 모든 스레드 순간, 실행 해당 자원의 모든 스레드와 (모든 자원과 실행중인 스레드 실행의 모든 스레드와 실행중인 상태 플래그 표시를 포함하는) 프로세스의 동작 상태를 나타내는 플래그를 포함
2. 실행 동시 평행 구별의 순서
실행 순서 : 다음 문제에 문제를 설명하고 학생들에게 학생 순위 완료 후 더 숙제, 첫 번째 학생이 이전에 과외, 과외 교사 소화를 설명하는 두 번째 학생 상담 완료
동시성 : 첫 번째 학생이 첫 번째 질문을 소화 할 때 문제를 설명 후, 첫 번째 학생 과외하기 전에 학생들을 개인지도 교사보다 더 많은 상담의 두 번째 학생이, 이렇게 많은 시간을 절약하면서, 교사들이 할 수없는, 완료 상담 정지 ( 는 CPU 행한다 I / O 동작)
병렬 자세한 교사 일 만 학생을 과외 하나에
3 . 스레드의 여러 상태
새로운 상태 : 새 키워드는 새 스레드를 만들 수 있습니다
실행 실행 상태
당신이 CPU 시간이이 스레드의 후면, 국가의 실행 상태로 스레드에 할당 된 CPU의 대기 시간을 할당 할 수 차례의 실행 가능한 시작 방법을 수행 한 후 즉시 실행되지 않습니다 스레드의 새로운 상태를 ①
② 현재 스레드 실행 슬립 () 메소드 () 메소드 또는 사용자 입력이 차단 된 상태로 스레드를 기다리는 시간에 참여 슬립 (), 상기 사용자 입력의 대기 () 메소드가 완료되거나 완료되면 스레드는 실행 가능한 상태가된다
③ 대기 풀에 스레드의 대기 () 메소드 후 현재의 thread가, 실행의 다른 스레드가 무작위로 일어나 스레드 잠금 풀에 대기 풀에서 될 것입니다 () 메소드를 통지하는 경우, 다른 스레드 () 메소드의 notifyAll을 호출하는 경우, 대기 넣어 모든 스레드 내부 풀은 풀에 잠겨
개체의 잠금을 획득하기 위해 스레드 내부 풀을 고정 ④ 스레드는 실행을 시작합니다
죽음의 상태 :
① 스레드는 자연적인 죽음을 완료
②이 나타나고 억압 강제 예외를 발생
4 . 운영 체제 또는 실행 소프트웨어 스레드 JVM의 동작을
대학은 모든 진실을 알아야 할 컴퓨터 구성 원리를 연구, CPU는 읽어 하드웨어 메모리보다 훨씬 빠르게 실행하고 하드웨어 속도 생산하기 위해, 쓰기 속도 문제로 실행 제한 컴퓨터, 그것은 메모리 사이의 속도 는 CPU와 캐시 캐시는 또한 CPU가 해당 메모리를 다음 캐시를 찾아 갈 때 데이터가 메모리에 읽을 수없는 경우, 캐시 주소에 따라 데이터를 발견하고 때 일시적으로 데이터를 저장하는 메모리에 대한 책임 존재로왔다 다음번 판독 캐시 버퍼로 데이터를 따라서 다음도 캐시 메모리 등 포터 CPU 간의.
현재 광범위한 멀티 코어 컴퓨터의 CPU, 우리는 이제 차트를 보면
멀티 코어 전방 측 CPU의 멀티 코어 CPU
현재의 시스템은 일반적으로 멀티 코어이므로 CPU, 진정한 의미의 (복수의 스레드가 동시에 실행) 동시에 달성 될 수 있고, 또한 더 많은 동시 스레드 (같은 다중 스레드를 실행하는 동일한 시간)을 달성하지만, 다중 스레드를 달성하는 방법 데이터베이스의 작업을합니까? 이 같이 JVM을 포함
VM 스택 : 정보 저장, 오퍼랜드 스택, 동적 링크있어서 수출 로컬 변수 테이블.
本地方法:用于存储进程调用的native方法
知道上面这些和之前我们在第一部分提到的线程和进程的区别就好说啦;因为一个进程就相当于一个软件,当一个软件启动的时候jvm会作出什么工作呢?
① 当进程启动时操作系统会将此进程运行时需要的所有相关数据都加载到jvm对应区域,把图片,视频,等所有的或者部分(视当前运存大小而定)静态资源加载到方法区内,此时进程启动完毕,等待要执行的线程
② 单线程时:线程开始执行,CPU根据虚拟机栈里面的存储局部变量表去堆里面找寻对应的数据,若找不到则去内存中寻找,然后线程结束的时候会将此单个线程工作区里面的数据写回到内存。
③ 多线程时(不加锁):当出现多线程的时候,jvm会把堆根据线程一一对应进行分解变成一个个的线程工作区,每一个工作区内的数据都是一样的,相当于将内存的对应数据映射到工作区。当等待池中的某个线程获取到CPU时间后开始执行;若其对应的线程工作区里面的数据发生改变,则不会导致对应内存的数据发生变化,如果此时其它在等待池的线程获取到CPU时间的时候也对自己线程工作区的此数据修改则产生数据不一致,这是产生数据不一致的根本原因。
④ 多线程时(加锁):当jvm在加载 .class 文件时,当遇到synchronized关键字,则会在被锁代码前面加monitorenter关键字,在末端加monitorexit关键字,等待池中的某个线程获取到对象监听器(锁)的时候线程工作区从内存读取数据然后此线程进入锁池,锁池中的线程获取到cpu时间则对自己线程工作区的数据进行操作;每遇到一次monitorenter时对象的锁计数器加一,若遇到monitorexit时锁计数器减一,当计数器为0的时候释放锁;然后将对处理后的对象数据写回到内存中从而实现线程之间数据的通信。如下图
综上所述:加锁是为了线程安全,本质上是为了在每次线程执行完毕之后将工作区的的对象的数据写回到内存;每次线程执行之前将工作区对应的数据更新从而保持数据的一致性和实现线程之间的通信,然而实现这种效果需要满足多线程的原子性,可见性和有序性
5. 满足线程安全的三个属性
原子性:各个线程之间进行数据的互斥访问,同时刻只能有一个线程对数据进行操作
可见性:一个线程对数据修改后可以被其它线程看到(线程之间实现通信)
有序性:在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。而有序性是指程序的代码执行顺序和语句的顺序是一致的。
6. 实现三个属性的方法
原子性:保证原子性的方法有atomic和synchronized,前者应用不是太多,这里主要介绍后者;
synchronized修饰的对象有四种(原理在上文已经提到):
(1)修饰代码块,作用于调用的对象;
(2)修饰方法,作用于调用的对象;
(3)修饰静态方法,作用于所有对象;
(4)修饰类,作用于所有对象。
可见性:volatile,声明变量的时候前面添加volatile关键字,每次多线程对工作区内的此变量进行操作后都强制将其写回内存,每次要操作此变量时强制更新来实现多线程的工作区数据和内存对应数据保持一致,进而间接实现多个线程之间的数据通信。
有序性:可以通过volatile、synchronized、lock保证有序性。
另外,JMM具有先天的有序性,即不需要通过任何手段就可以得到保证的有序性。这称为happens-before原则。
如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就不能保证它们的有序性。虚拟机可以随意地对它们进行重排序。
happens-before原则:
1.程序次序规则:在一个单独的线程中,按照程序代码书写的顺序执行。
2.锁定规则:一个unlock操作happen—before后面对同一个锁的lock操作。
3.volatile变量规则:对一个volatile变量的写操作happen—before后面对该变量的读操作。
4.线程启动规则:Thread对象的start()方法happen—before此线程的每一个动作。
5.线程终止规则:线程的所有操作都happen—before对此线程的终止检测,可以通过Thread.join()方法结束、Thread.isAlive()的返回值等手段检测到线程已经终止执行。
6.线程中断规则:对线程interrupt()方法的调用happen—before发生于被中断线程的代码检测到中断时事件的发生。
7.对象终结规则:一个对象的初始化完成(构造函数执行结束)happen—before它的finalize()方法的开始。
8.传递性:如果操作A happen—before操作B,操作B happen—before操作C,那么可以得出A happen—before操作C。
有部分借鉴的大佬的,有些自己总结的,欢迎指出错误