java jmm 多线程 线程池

1.计算机五大核心组成部分

    控制器,运算器,存储器,输入,输出设备

现代的计算机如下,其中cpu跟内存是核心比较重要

2.cpu指令结构

控制单元,运算单元,数据单元

3.cpu缓存结构(L1L2L3)

       A。从内存将数据读入cpu速度太慢,然后添加了缓存,缓存大小顺序 内存>L3>L2>L1

读写速度L1>L2>L3>内存,

       B。缓存是由最小存储块-缓存行(cacheline)组成,缓存行的大小通常是64byte

       C。数据读取,只能是先看L1有么有,没有的话去L2读,还不存在的话就会去L3读,还没找到的话就去内存里面找。找到数据后,先加锁。然后从内存复制到L3,从L3读过来之后先复制到L2,然后再复制到L1,然后读入cpu,然后解锁

4.操作系统的内存管理

 它分为内核空间和用户空间,在物理地址上有一定的虚拟映射和划分,

5.进程和线程

进程是cpu分配资源的基本单元

线程是cpu执行的基本单元

一个进程可以有多个线程,每个线程都拥有自己的pc,方法栈,局部变量表本地方法栈等,并且能够访问共享的内存变量。cpu在不同线程上的高速切换,让我门感觉倒好像是在同时运行,这就是并发,还有相同的概念叫做并行。

线程切换上下文的过程当中,需要保存pc指针当前运行的数据等,然后将其他线程的运行的数据加载到pc寄存器中比较费时费力

6.jmm(她是一个规范,规范规定了程序中各个变量的访问方式)

jvm运行的实体是线程,而每个线程创建的时候,jvm都会为他分配一块内存用来存储工作过程当中的数据。jmm规定所有的数据都要存储在主存当中,主存是共享区域,所有线程都可以访问,但线程对变量的操作必须在主存中进行,首先将变量从主存中拷贝到自己的工作内存中,然后对变量操作,操作完之后再将数据写回内存,不能直接操作内存中的变量。线程的工作内存储存着主内存的变量的副本。线程的工作内存是私有的,因此不同线程 不能相互访问工作内存。线程间通讯只有通过主存来进行。

多线程共享,假如俩个线程同时调用同一个对象的同一个方法,那么俩个线程会将要操作的数据拷贝到自己的工作内存,操作完之后再将数据写回主存中

jmm存在的必要性

每个线程创建的时候都会将主存当中的变量拷贝到工作内存中,操作完之后再将数据写回主存中,当多个线程针对同一个主存中的数据发生操作时,就会产生数据的线程安全的问题

主存与工作内存之间的操作要蹲守8大原子规则

lock  unlock 对主存中的变量,标记一个线程独占状态(释放锁,其他线程可以使用变量)

read write  对主存变量 拷贝到工作线程,从工作内存写回主存

load store 将read或者write过来的值加载到工作内存或传输到主存中

use assign 将工作变量的数据交给执行引擎或者从引擎中手中获取值赋给工作内存的变量

java内存模型要求下图的必须严格按照顺序执行,而没有保证连续性

启动线程的三种方法

1.继承Thread 重写run方法,调用start()方法

2.实现Runnable 

3.利用线程池

终止线程

1.自然终止

   A。run方法执行完毕

   B。执行run 的时候抛出一个错误异常信息导致提前结束

2.stop方法

线程自带了一些线程的suspend resume stop方法但是已经过期,调用的时候不会释放占用资源而让线程处于睡眠状态

线程的生命周期

 1.Sleep (线程先睡一会让其他线程先执行,睡醒之后接着执行)

2.yield 让出cpu一段时间给同级或者更高优先级的线程,然后进入cpu的就绪队列(如果持有锁的话不会释放锁资源)

3.join 在一个线程t1中调用另外一个t2.join(),t1会等待t2执行完之后再接着执行

并发编程重点

1.原子性(可通过Lock synchronized 能够保证同一时刻只有一个线程可以访问变量)

一个操作不可中断,即使在多线程环境下,操作一旦开始就不允许其他线程打扰

对于64位操作系统来说基本数据类型的操作时原子性的32位的不是原子性的

2.可见性(volatile 当一个变量被修饰时,一个线程对他进行修改时,会及时将主存中的值进行刷新,一个线程对他读值时会首先取主存当中读取 sync和Lock也可以实现,因为他们可以保证同一时刻只有一个线程操作变量,在unlock指令的时候会将工作内存的值读回主存中)

每个线程都拥有主存的变量拷贝的副本,每个线程工作内存中的变量相互不能访问,工作内存与主存之间的延迟现象造成了可见性问题

3.有序性(volatile关键字,sync和lock可以通过在同一时刻只有一线程访问来保证代码的同步执行)

对于多线程的环境下,有可能出现这种现象,代码被编译成机器码时可能会出现指令重拍的问题,重拍后的指令与原来的指令未必相同

Volatile

1.禁止指令重排序(内存屏障)

2.保证线程之间的可见性

缺点:无法保证原子性

解决并发安全问题

1.Synchronized

   (1)作用域

    A。修饰普通方法,使用的锁是实例对象

    B。修饰静态方法,使用的锁是Class对象

    C。同步代码块,使用的锁是括号里面的对象

 (2)底层原理

    

2.Lock

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值