zoukankan      html  css  js  c++  java
  • 周会材料:高并发程序设计<一>

    第一章

    几个概念

    • 同步:一次方法调用须等到其返回后才能有后续
    • 异步:一次方法调用后在另一线程执行,调用者可不必等其返回就可进行后续
    • 并发:任务以极短的时间交替进行
    • 并行:任务同时进行
    • 临界区:公共资源
    • 阻塞:临界区资源被占用,须等待前一线程释放。
    • 死锁:彼此占用所需资源,都无法继续进行
    • 饥饿:线程优先级太低,总是无法获得资源
    • 活锁:线程彼此主动释放资源给对方,导致无法拿到所有资源正常执行

    并发级别:

    • 阻塞:临界区加锁,得不到锁就会被挂起等待直到得到所有资源(悲观)
    • 无饥饿:公平的锁,所有主程序都有机会执行
    • 无障碍:大家都能拿到资源,出了冲突就回滚(乐观),可能导致无限回滚,无法执行完任意一个线程
    • 无锁:无锁的并行都是无障碍的,不同的是必然会保证有一个线程能够在有限步完成执行
    • 无等待:要求所有线程在有限步内完成(一种实现情况是:读时不加控制,写时修改在副本上伺机返回)

    JMM(Java的内存模型)建立原则:原子性,可见性,有序性

    原子性:操作不可分,一旦执行不会被干扰

    可见性:一个线程修改了一个共享变量的值,其他变量能否立刻知道此修改

    有序性:程序执行顺序问题(由指令重排导致)

    第二章

    1.进程与线程

    2.线程的基本操作

    • 新建线程:继承Thread或者实现Runable/Callable,重写run,调用start。
    • 终止线程:尽量不使用stop()方法
    • 线程中断:interrupt()——增强的stop方法

    • 等待与通知(与锁有关)

        wait(),notify()必须是包含在synchronzied语句中的----notify()随机唤醒一个线程,notifyAll()全部唤醒。

    • 挂起与继续执行(废弃方法)
    • 等待线程结束(join())与谦让(yield)

    可以看出来当前等待对象threadA会一直阻塞,直到被等待对象threadB结束后即isAlive()返回false的时候才会结束while循环,当threadB退出时会调用notifyAll()方法通知所有的等待线程.

     public static native void yield();这是一个静态方法,一旦执行,它会是当前线程让出CPU,但是,需要注意的是,让出的CPU并不是代表当前线程不再运行了,如果在下一次竞争中,又获得了CPU时间片当前线程依然会继续运行.另外,让出的时间片只会分配给当前线程相同优先级的线程.

     3.对于经常修改的字段类型,可以使用字段volatile确保线程改动数据后其他线程可以看到此改动。

     4.线程组

    5.守护线程,执行系统的工作线程,特点是当只此线程时虚拟机会停止(Daemon)———可自定义,

    6.线程优先级

    7.synchronized关键字

    并发下的错误:

    ArrayList:线程不安全(访问时破坏了内部一致性、访问时保存容器大小的变量访问异常)——————使用Vector 

    HashMap:线程不安全(可能结构破坏出现环导致无法退出)——————————————————使用ConcurrentHashMap

    i++本质:i=Integer.valueOf(i.intValue()+1);其中,Integer.valueOf是一个工厂方法,每次创建一个新的Integer对象,并将其引用复制给i

    i++

  • 相关阅读:
    理解cookie
    浏览器解析url后执行过程
    如何使用D3绘制折线图
    Django 笔记
    vi命令
    PEP8编程规范
    Python_入门第一篇【持续更新...】
    DjangoWeb _ 登录页开发test
    Django开发流程
    Django 笔记2018.2.7
  • 原文地址:https://www.cnblogs.com/lvoooop/p/12021668.html
Copyright © 2011-2022 走看看