java并发(一)-- 走进并发世界

并发需要解决的问题场景:提升效率、有些工作需要异步处理(比如大图片的处理)

并发的几个概念:

1. 同步/异步

同步:一次请求直接拿到响应,无需后续操作

异步:一次请求不能立即给出响应,需要后续多个操作来完成,异步一旦开始,就会立马拿到结果,不用关心后续动作,调用者可以继续后续的事情。

2.临界区

 临界区用来表示一种公共资源或者说共享数据,可以被多个线程使用,但是每一次只能由一个线程使用它,一旦临界区资源被占用,其他线程则不能访问

 3.阻塞/非阻塞

 阻塞和非阻塞是用来形容多线程间的相互影响,比如一个线程占用了临界区资源,那么其他所有需要这个资源的线程就必须在这个临界区中等待。等待就会导致线程挂起,这种情况就是阻塞。

 非阻塞的意思与之相反,他强调没有一个线程与之抢占资源,当前线程不断的向前执行。

 4.死锁/饥饿锁/活锁

 死锁:资源间相关调用,导致都无法进行产生的一种锁状态

饥饿锁:前置线程一直占用资源,导致后面的线程一直拿不到资源,产生类似于饥饿的状态,称之为饥饿锁,

饥饿锁是有可能解决的

活锁:当前线程在获取到资源时,由于自身原因而不执行,把资源释放掉,另一个拿到资源的线程也产生这种情况,这样就导致谁都没有完整的获取到资源。

5.并发级别

阻塞:线程被占用,等待执行的一种状态,线程等待或者同步锁都会造成这种情况

无饥饿:线程实现公平锁机制,线程资源等待排序使用,如果时非公平锁,资源空闲时线程资源通过抢占来获取,优先级高的抢占概率大,这样可能造成有些资源一直获取不到线程

无障碍:线程使用信任的一种方式,也就是乐观锁,执行任务时信任为没有线程使用过,在使用时先判断是否有更改,如果没有更改则直接使用,如果有更改重新计算,(可通过全局计数器来判断)

无锁:线程在规定步内只能有一个线程正常的离开临界区

无等待:在规定的步内允许多个线程完成离开临界区

6.加速比

采用两种形式:amdahl、gustafson

amdahl 对于n台服务器: = 1/(f+(1-f)/n)

        f :串行比例,比如一个任务需要1min执行完成,同步串行需要30s,非串行30s,则串行比例为0.5

gustafson =(a+n*b)/(a+b)

        a:串行时间,b:并行时间

加速比:加速前的时效/加速后的时效

7. JMM(内存模型)

 原子性:一个线程操作是不可被打断的,即使多个线程一块操作时,一个操作一旦开始就不会被打断。

 可见性:当修改一个公共变量时,其他线程能立马拿到修改后的值

 有序性:对于一段代码我们总是认为会从前往后依次执行,这种感觉对于单线程来说是不可厚非的,但是对于多线程就会出现乱序,写在前面的代码不一定先执行,造成这种现象的原因可能是发生了指令重排序,

一条指令需要经过几步完成

 8. 指令重排

  指令的几个步骤

  1. IF:取值

  2. ID:译码和取寄存器指令数

  3. EX:执行或者有效地址计算

  4. MEX:存储器访问

  5. 写回WEB

  指令重排是有原则的,并非所有的指令都可以随便改变执行的位置,需要满足一定的原则

   1. 程序顺序原则:一个线程内保证语句的串行

   2. volatile规则:volatile变量写优先于读,保证volatile变量的可见性

   3. 锁规则:解锁必然发生在所有的加锁前

   4. 传递性:A优先于B,B优先于C,则A优先于C

   5. 线程的start()先于他的所有方法

   6. 线程的所有操作先于线程的终结(Thread.join)

   7. 线程的中断(interrupt)优先于被中断的方法

   8. 线程的构造方法的执行、结束优先于finalize方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值