java多线程2

  1. “非线程安全”问题存在于“实例变量”中,若是是方法内部的私有变量,则不存在线程安全问题。这是由于方法内部的变量都是私有形成的。java

  2. synchronized 获取的都是对象锁。若是多个线程访问多个对象,则JVM会建立多个锁。安全

  3. A线程持有object 对象的的Lock锁,B线程能够异步调用A线程非同步方法。A线程持有object 对象的的Lock锁,B线程若是在这个时调用object对象中的synchronized类型的方法则须要等待。多线程

  4. synchronized拥有锁重入的功能。当一个线程获得一个对象锁后,再次请求对象锁时是能够再次获得该对象的锁。异步

  5. 可重入锁支持在父子类继承的环境中。工具

  6. 当一个线程出现异常,其持有的锁自动释放。this

  7. 同步不具备继承。线程

  8. synchronized(非this对象)同步代码块格式时,持有不一样的对象监视器是异步的效果。对象

  9. synchronized还能够做用在static静态方法上,那是对*.java文件对应的Class类进行加锁。继承

  10. 使用JDK自带工具查看线程是否死锁:进入JDK安装目录,bin目录下,执行jps命令。再执行jstack -l xxx 。内存

  11. volatile 是变量在多个线程可见。强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。

  12. volatile不支持原子性。

  13. volatile vs sysnchronized:

    • volatile 是非线程安全的,而 sysnchronized 是线程安全的。
    • volatile 只能做用于变量,而 sysnchronized 能够做用于方法,代码块。
    • 多线程访问 volatile不会发生阻塞,而sysnchronized会发生阻塞。
  14. 变量在内存中的过程:

    • read和load阶段:从主内存复制变量到当前线程工做内存。
    • use和write阶段:执行代码,改变共享变量的值。
    • store和write阶段: 用工做内存数据刷新主内存对应的变量。
  15. 执行完同步代码就会释放对象的锁;在执行同步代码的过程当中,遇到异常而致使线程终止,锁也会被释放;在执行同步代码的过程当中,执行了锁对象所属的wait()方法,这个线程会释放锁对象,而此线程对象会进入线程等待池中等待唤醒。

  16. join()的做用是等待线程对象销毁。在内部使用wait()方法进行等待。

  17. join(long) vs sleep:前者在指定时间后会释放锁,然后者不会。

  18. ThreadLocal 解决的是变量在不一样线程之间的隔离性。

  19. InheritableThreadLocal 能够在子线程中取得父线程继承下来的值。

  20. Lock.getHoldCount()方法能够查询当前线程保持此锁定的个数,即调用lock方法的次数;getQueueLength()返回正等待获取此锁定的线程估计数;getWaitQueueLength(Condition condition)返回等待与此锁定相关的给定条件condition的线程估计数。

  21. 其余方法:

    • hasQueuedThread(Thread thread):查询指定线程是否正在等待获取此锁定;
    • hasQueuedThreads():查询是否有线程正在等待获取此锁定;
    • hasWaiters(Condition condition)的做用是查询是否有线程正在等待与此锁定有关的condition条件。
  22. condition.awaitUntil(xxx):设置线程特定时间后自动唤醒。在等待中,能够被其余线程提早唤醒。

  23. ReentrantReadWriteLock:多个线程可读,一个线程写。该锁维护2个锁,一个读锁,也称为共享锁,一个写入锁,也称为拍他锁。多个读锁之间不互斥,读锁写锁互斥,写锁与写锁互斥。