多线程学习(二)

  1. 线程安全问题:在同一时刻,当多个线程共享同一个全局变量,做写的操作是可能会收到其他线程干扰,导致数据出现问题,这种现象叫做线程安全问题。
  2. 线程同步
    (1) 实现同步的方法:synchronized、lock(jdk1.5并发包)
    (2) 必要条件:
    ① 必须要有两个以上的线程,需要发生同步
    ② 多个线程想同步,必须用同一把锁
    ③ 保证只有一个线程进行执行
    (3) 原理:
    ① 有一个线程已经拿到了锁,其他线程已经有cpu执行的,一直排队,等待其它线程释放锁
    ② 锁是在什么时候释放?代码执行完毕或者是程序抛出异常都会释放锁
    ③ 锁已经被释放掉的话,其他线程开始获取锁进入同步中去
    (4) 缺点:效率低下
  3. 一个线程使用同步函数,另一个线程是同步代码块this能够同步;如果里一个是非this的同步代码块则不能同步。
  4. 非静态同步函数是用的是this锁,静态同步函数使用的是字节码文件锁(xxx.class)
  5. 多线程思索现象:同步中嵌套同步,无法释放,一直等待,变为死锁。
  6. 多线程三大特性:
    ① 原子性:独一无二,保证线程安全问题
    ② 可见性:线程修改可以看的见
    ③ 有序性:join,wait、notify(多线程之间的通讯)
  7. java内存模型决定了一个线程与另一个线程是否可见。
    java内存分为多个区域:主内存(存放共享的全局变量)、私有本地内存(存放本地线程私有变量)。
  8. volatile作用:保证线程之间可见,但不保证原子性,即不保证线程安全
  9. 多线程之间的通讯:多个线程对同一个资源(贡献资源),每个线程对共享资源做的动作不同,操作不停。
  10. wait的作用:让当前线程从运行状态变为休眠状态;notify:让当前线程从休眠状态变为运行状态。只能在同步中使用。
  11. java1.5并发包中进行通讯的类是Condition,里面有类似Object中wait,notify的方法,例如await、signal.
  12. Lock锁与synchronized关键字的区别:
    ① Lock接口可以尝试非阻塞的获取锁,当前线程尝试获取锁。如果这一时刻锁没有被其他线程获取到,则成功获取并持有锁。
    ② Lock接口能被中断的获取锁 与sybchroized关键字不同,获取到锁的线程能够响应中断,当获取到的锁的线程被中断时,中断异常将会抛出,同时锁会被释放。
    ③ Lock接口在指定的截止时间之前获取锁,如果截止时间到了依旧无法获取锁,则返回。
  13. interrupt让当前等待的线程直接抛出异常。
  14. ThreadLock:本地线程 为每个线程提供一个局部变量
  15. ThreadLock原理:获取当前线程,放入一个map中。进行对map的修改。

你可能感兴趣的:(多线程学习(二))