通用技术 [java][thread] 多线程知识

bauul · 2018年06月25日 · 最后由 bauul 回复于 2018年09月17日 · 1875 次阅读

Thread

线程的状态
  • NEW
  • RUNNABLE
  • TERMINATED
  • TIMED_WAITING
  • BLOCKED
  • WAITING
执行 thread.start() 方法与 thread.run() 方法有什么分别?

同步与异步的分别

interrupted 与 isInterrupted
Daemon

synchronized

修饰方法:对象锁
public class MyObj {
  synchronized public void mA() {

  }
}
修饰静态方法:类锁
public class MyObj {
  synchronized static public void mA() {

  }
}

等同于

public class MyObj {
  static public void mA() {
    synchronizedMyObj.class) {
     }
  }
}
修饰代码块: 因为 synchronized 修饰方法时,整个方法被锁住,导致执行效率低,于是将 synchronized 缩小到需要同步的代码块,以提高执行效率
public class MyObj {
  public void mA() {
    synchronized (this) {

    }
  }
}
小结:

synchronized ==> 当两个线程操作同一个类对象的 synchronized 方法或代码块(可以是不同的 synchronized 方法或代码块)时,会产生同步的效果
synchronized ==> 当两个线程操作同一个类对象的两个方法(一个 synchronized 方法,另一个非 synchronized 方法)时,不会产生同步的效果
synchronized ==> 当两个线程操作同一个类的两个对象时,不会产生同步的效果

wait(), notify(), join()

wait() ==> 锁自动释放 ==> 就是说执行 wait() 方法后,wait() 方法后续的代码不会继续执行,即刻释放锁
notifiy() ==> 锁不自动释放 ==> 就是说执行 notifiy() 方法后,notifiy() 方法后续的代码会继续执行到方法完成,即不会立刻释放锁
join() ==> join 在内部使用 wait() 方法进行等待,由于 wait 具有释放锁的特点,所以 join 也具有释放锁的特点

ThreadLocal

ThreadLocal 是为了解决线程的共享变量,每个线程自己的共享变量
InheritableThreadLocal 可以在子线程中取得父线程继承下来的值

ReentrantLock:默认为非公平锁

Condition

// 公平锁
new ReentrantLock(true);

// 非公平锁
new ReentrantLock(flase);

ReentrantReadWriteLock

读锁 & 读锁 ==> 不互斥
读锁 & 写锁 ==> 互斥
写锁 & 写锁 ==> 互斥

Reference

《java 多线程编程核心技术》
《图解 java 多线程设计模式》

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 4 条回复 时间 点赞

来打卡学习~

面试宝典

simple 回复

多线程确实是面试必问的问题

hello 回复

互相学习

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册