多线程基础
Posted simple-ly
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程基础相关的知识,希望对你有一定的参考价值。
-
内置锁
Java提供一种内置的锁机制提供原子性:同步代码块(synchronized),synchronized锁包含两部分,锁的对象引用和锁保护的代码块。
方法同步代码块锁的是方法调用所在的对象,静态方法同步代码块锁的是Class对象。同一对象的方法同步代码块和静态方法同步代码块是两把锁,因为锁对象一个是当前对象,一个是Class对象。
获取锁内置锁的唯一途径就是进入锁保护的同步代码块或方法。它是一把互斥锁,最多只能一个线程持有锁。
-
重入
线程请求其他线程持有的锁时会发生阻塞。如果尝试获取由自己持有的锁时,锁能请求成功。
重入意味的锁的操作粒度是“线程”而不是“调用”,JVM采用计数器的方法实现锁的重入。
每个锁关联一个计数器和一个所有者线程,计数值为0,锁没有被线程持有,当线程请求未被持有的锁时,JVM记下锁的持有者线程,并将计数器值设为1,如果线程再次获取这个锁,计数器递增为2,以此反复。
如果线程退出同步代码块,计数器值-1,当计数器值为0,锁被释放,JVM清空锁的持有者线程信息。
-
Volatile变量
volatile变量用来确保将变量的更新操作通知到其他线程。
volatile变量不会被指令重排,也不会缓存在寄存器等其他处理器不可见的地方。
volatile变量的一种典型用法是检查某个状态标记以判断是否退出循环。
volatile boolean asleep; while(!asleep) doSomething();
volatile通常用于某个操作完成、发生中断、状态的标志。
-
ThreadLocal
ThreadLocal使线程中的某个值与保存值的对象关联起来,每个使用该变量的的线程都存有一份独立的副本。通常用于防止对可变的单实例变量或全局变量进行共享。
ThreadLocal使用时,getter之前必须先setter,并且执行结束一定一定一定要记得remove。由于线程池等线程复用,如果没有remove会导致该线程在被唤醒时,还保留有之前的数据,可有可能导致数据乱窜。
参考:
《Java并发编程实战》
以上是关于多线程基础的主要内容,如果未能解决你的问题,请参考以下文章