《笔记》之学习高并发

《笔记》1.学习高并发

读者,你好!这是我的第一篇Blog,纯属记载学习https://my.oschina.net/hosee/blog/597934高并发知识时候的一些记录和个人领悟!

高并发就是同一时刻有多个线程访问了同一个数据资源;

常见而说不出口的名词

  1. 同步 :你得等待上一个请求完成才能在发送请求;
  2. 异步 :你发送请求时不需要等待上一个请求结束;
  3. 并行 :(并肩前行嘛?)两条生产线上的流水,共同前行,互不影响 (单CPU是无法实现的);
  4. 并发 :一个生产线,一会这个任务运行一下,一会又切换另一个任务执行一会 (多任务交替进行);
  5. 临界区 ,见图:(个人理解就是:资源占用区间)
    在这里插入图片描述
  6. 死锁 所有线程都处于互相等待的一种静止状态;(资源相互竞争/线程间相互通信造成的阻塞)
  7. 活锁 所有线程都在相互交换仅有的资源(部分),造成谁也没有机会得到所有资源造成阻塞的一种动态
  8. 饥饿 是指线程一直得不到所需资源,而得不到执行的状态;
  • 并发级别的阻塞和非阻塞:
  • 阻塞:当一个线程进入临界区时,其他线程都必须等待;
  • 非阻塞:可分为无障碍,无锁,无等待
    • 无障碍:(最怂的的非阻塞调度,不能确保有竞争是一定能完成操作)
      • 自由进出临界区
      • 无竞争时,有限步完成操作,尽快释放
      • 有竞争时,(立马放弃,回滚数据)
    • 无锁(可解决无障碍的问题,至少保障所有线程都能执行下去 广泛使用
      • 无障碍的(即包含无障碍的特性)
      • 保证有线程可以获得资源
        无锁代码可以参考链接文中(大佬代码就不复制,尊重一下)
    • 无等待(最优状态,但难以实现)
      • 无锁的
      • 要求所有线程都要在有限步内完成操作即无饥饿的(即使优先级极低也是可以完成的,不会一直处于等待)

进程&线程

  • 线程是进程的执行单元
  • 多进程一般不考虑并发,并发通常为多线程设计;
  • Jvm将会把Java中的线程映射到操作系统的线程区;
  • 线程启动:Thread.start()
  • 优雅的线程中断示例:
public void run(){ 
    while(true)
    { 
        if(Thread.currentThread().isInterrupted())
        { 
           System.out.println("Interruted!"); 
           break; 
        } 
        Thread.yield(); 
    } 
}

使用中断,保证了数据的一致性。

对于可取消的阻塞状态中的线程, 比如等待在这些函数上的线程, Thread.sleep(), Object.wait(), Thread.join(), 这个线程收到中断信号后, 会抛出InterruptedException, 同时会把中断状态置回为false.

对于取消阻塞状态中的线程,可以这样抒写代码:

public void run(){
    while(true){
        if(Thread.currentThread().isInterrupted()){
            System.out.println("Interruted!");
            break;
        }
        try {
           Thread.sleep(2000);
        } catch (InterruptedException e) {
           System.out.println("Interruted When Sleep");
           //设置中断状态,抛出异常后会清除中断标记位
           Thread.currentThread().interrupt();
        }
        Thread.yield();
    }
}
  • 线程关闭:太暴力不推荐(容易导致数据不同步)Thread.stop()==>直接释放所有monitor?是我的风格

  • 线程中断:(并非立马停止,只是将线程的.isInterrupted状态改为true,提醒他接下来你要自己找个合适的时机准备停下来)但实际上并没有停下来,只是改个状态而已
    public void Thread.interrupt() // 中断线程
    public boolean Thread.isInterrupted() // 判断是否被中断
    public static boolean Thread.interrupted() // 判断是否被中断,并清除当前中断状态

  • yeild

  • yeild是个native静态方法,这个方法是想把自己占有的cpu时间释放掉,然后和其他线程一起竞争(注意yeild的线程还是有可能争夺到cpu,注意与sleep区别)。

  • join

  • 方法的意思是等待其他线程结束
    未完待续 >a<
    谢谢观看,如有理解错误的地方,烦请指出 >#<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值