多线程基础

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

  

以上是关于多线程基础的主要内容,如果未能解决你的问题,请参考以下文章

多线程Java多线程学习笔记 | 多线程基础知识

Java基础教程:多线程基础——线程的状态

java 基础学习:多线程04

并发编程多线程基础

多线程基础

Java基础学习多线程基础面试题形式