码迷,mamicode.com
首页 > 编程语言 > 详细

多线程基础

时间:2019-07-06 20:59:44      阅读:161      评论:0      收藏:0      [点我收藏+]

标签:方法   方法调用   全局变量   ola   线程   setter   可变   计数   实现   

  • 内置锁

  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并发编程实战》

  

多线程基础

标签:方法   方法调用   全局变量   ola   线程   setter   可变   计数   实现   

原文地址:https://www.cnblogs.com/simple-ly/p/11144061.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!