ThreadLocal的使用

64 阅读2分钟

前言

JDK1.2版本提供的threadLocal,threadLocal为解决多线程的并发问题提供了一种新的思路。 它的含义是线程的局部变量,ThreadLocal为每一个使用该变量的线程,提供独立的副本,所以每个线程都可以独立地改变自己的副本,而不会影响到其他线程所对应的副本。

使用场景

如为每个线程分配一个JDBC连接,这样可以保证每个线程都在各自的连接上进行数据库操作,不会出现线程A关闭了线程B正在使用的连接。还有session管理等问题。

多线程AVO原则

  1. 原子操作原则,对于基本数据类型的变量读和写是保证原子性的,要么都成功,要么都失败,这些操作不可中断。
  2. 可见性原则,保证了变量的可见性,从主存中拿数据,而不是到缓存中里拿
  3. 有序性原则,代码执行顺序,在代码编译前和代码编译后的执行顺序不变

单CPU时代的多线程

单核CPU上,同一时刻只能有一条线程运行,单核CPU上运行单线程程序和多线程程序,从运行效率来看基本没有差别。

多核CPU上。多线程在不同CPU核上运行,但实际中,线程数往往多于CPU个数,所以一般来说都是多线程并发编程而非多线程并行编程

共享变量内存可见性问题

由于JVM内存模型,我们知道变量都是存储在主存中,内存可见性意味着数据就是公开的,所有线程都是对可见性的数据源进行增删该查操作。

一个线程操作共享变量是,它首先是从主存中复制共享变量到自己的工作内存中,然后对副本进行处理,处理完了再将变量值更新到主存中。

所以多线程编程下,我们必须要考虑,数据的安全问题

操作系统中线程的生命周期

线程被创建并启动不是一蹴而就的。它是有生命周期的:新建、就绪、运行、阻塞、死亡这五种过程的

这些转态是可以相互转化的。是和操作系统的调度有关的