Java 多线程学习(3)——总结

版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址:http://blog.csdn.net/huqigang,内容如有错误,欢迎留言指出,谢谢! https://blog.csdn.net/huqigang/article/details/81736532

个人系统读完《Java多线程编程核心技术》后的总结记录,不对正确性负责^_^

实现多线程的方法

  • 继承Thread类(不支持多继承)
  • 实现Runnable接口(支持多继承)

停止线程

使用interrupt()方法,给线程打上停止标记,在线程内部通过isInterrupted()判断线程是否是停止状态,通过throw new InterruptedException()抛出异常,停止线程。

synchronized

  • 线程A先持有object对象的lock锁,线程B可以异步调用object对象中的非synchronized类型方法,如果调用synchronized方法,则需等待A释放锁。
  • 锁重入,在一个synchronized方法/块的内部调用本类的其他synchronized方法/块,是永远可以得到锁的。
  • synchronized声明方法,可能会让其他线程等待比较长的时间,可以通过synchronized同步语句块解决。
  • synchronized方法是对当前对象加锁,而synchronized代码块,则是对某一对象加锁,根据传参判断。

volatile

主要作用是使变量在多个线程间可见。强制从公共堆栈取得变量值而不是从线程私有数据栈中取得变量值。

join

  • 使用场景:主线程创建子线程,如果子线程要进行大量的耗时运算,主线程往往早于子线程之前结束。使用join()可以等待线程对象销毁。
  • 使所属线程对象x正常执行run()方法中的任务,而当前线程z进行无限期的阻塞,等待线程x销毁后再继续执行线程z之后的代码。
  • join(long)的底层是使用wait(long)实现,会释放锁,而sleep(long)不会释放锁。

ThreadLocal

主要解决变量在不同线程之间隔离性,即让不同的线程拥有自己的值。

Lock

调用lock.lock()代码的线程就持有了“对象监视器”,其他线程只有等待锁被释放时再次争抢,效果同synchronized。

Condition

  • 一个Lock对象里可以创建多个Condition(即对象监视器)实例。线程对象可以注册在指定的Condition中,实现有选择性的线程通知。

使用notify()/notifyAll()方法,被通知的线程是由JVM随机选择/全部通知。

Condition通过await()和signal()/signalAll()方法实现等待和通知。

公平锁与非公平锁

  • 公平锁是线程获取锁的顺序是按照线程加锁的顺序来分配。
  • 非公平锁是一种获取锁的抢占机制,随机获得锁,可能造成某些线程一直拿不到锁。

读写锁

  • 共享锁,读操作相关
  • 排他锁,写操作相关

多个读锁之间不互斥,读锁和写锁互斥,写锁和写锁互斥。

猜你喜欢

转载自blog.csdn.net/huqigang/article/details/81736532
今日推荐