搜索
首页
笔记
案例
关于
课程列表
JavaWeb
Tomcat安装、部署等操作
Servlet
JSP
EL表达式与JSTL标签库
文件上传与下载
cookie与session
Filter过滤器
Listener监听器
ThreadLocal
Gson
课程导航
计算机基础知识
C
Linux
linux常用软件
计算机网络
程序员修养
设计模式
工具
Git
composer
vim
IntelliJ IDEA
wireshark
laravel
Spring
SpringMVC
Maven
数据库
MySQL
Redis
MongoDB
JDBC
Mybatis
MyBatis-Plus
服务端编程
PHP
Java
shell script
JavaWeb
HTML / CSS
HTML
CSS
HTML5
CSS3
BOOTSTRAP
JavaScript
JavaScript
JQuery
layui
Listener监听器
Gson
ThreadLocal
threadlocal而是一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据。ThreadLocal 它可以给当前线程关联一个数据(可以是普通变量,可以是对象,也可以是数组,集合)。 hreadlocal使用方法很简单 ```java static final ThreadLocal
sThreadLocal = new ThreadLocal
(); ThreadLocal.set() ThreadLocal.get() ``` 通过set方法给当前线程绑定一个数据,通过get方法获取这个绑定的数据。 **ThreadLocal 的作用**:可以解决多线程的数据安全问题。 **ThreadLocal 的特点:** 1. ThreadLocal 可以为当前线程关联一个数据。 2. 每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个ThreadLocal 对象实例。 3. 每个 ThreadLocal 对象实例定义的时候,一般都是 static 类型 4. ThreadLocal 中保存数据,在线程销毁后。会由 JVM 虚拟自动释放。 ## ThreadLocal演示 给每个线程都绑定一个值,然后再单个线程内的多个代码块打印这个绑定的值,看是否一直是同一个值。 ```java public class ThreadLocalTest implements Runnable{ private static Random random = new Random(); public static final ThreadLocal
threadLocal = new ThreadLocal<>(); @Override public void run() { // 为每一个线程绑定一个随机值 int num = random.nextInt(1000); threadLocal.set(num); System.out.println("线程:" + Thread.currentThread().getName() + "绑定的值是:" + num); new T1().m1(); int n = threadLocal.get(); System.out.println("线程:" + Thread.currentThread().getName() + "快结束时,取出的值是:" + n); } public static void main(String[] args) { for (int i=0; i<3; i++) { new Thread(new ThreadLocalTest()).start(); } } } public class T1 { public void m1 () { System.out.println("当前线程名:" + Thread.currentThread().getName() + ",获取绑定值为:" + ThreadLocalTest.threadLocal.get()); } } ``` 演示结果如下: ``` 线程:Thread-0绑定的值是:545 线程:Thread-1绑定的值是:904 当前线程名:Thread-1,获取绑定值为:904 线程:Thread-1快结束时,取出的值是:904 当前线程名:Thread-0,获取绑定值为:545 线程:Thread-0快结束时,取出的值是:545 线程:Thread-2绑定的值是:597 当前线程名:Thread-2,获取绑定值为:597 线程:Thread-2快结束时,取出的值是:597 ``` ## ThreadLocal与Synchronized ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题,不同的点是 - Synchronized是通过线程等待,牺牲时间来解决访问冲突 - ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,并且相比于Synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。 正因为ThreadLocal的线程隔离特性,使他的应用场景相对来说更为特殊一些。当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑采用ThreadLocal。 ## 实战:为每一个线程绑定一个Connection ```java package com.javaweb.book.utils; import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; public class JdbcUtils { private static DataSource dataSource = null; private static final ThreadLocal
conns = new ThreadLocal<>(); static { try { InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"); Properties properties = new Properties(); properties.load(inputStream); dataSource = DruidDataSourceFactory.createDataSource(properties); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConn () throws SQLException { Connection conn = conns.get(); if (conn == null) { conn = dataSource.getConnection(); conns.set(conn); } return conn; } public static void closeConn () throws SQLException { Connection conn = conns.get(); if (conn != null) { conn.close(); } // 一定要执行 remove 操作,否则就会出错。(因为 Tomcat 服务器底层使用了线程池技术) conns.remove(); } } ```
Listener监听器
Gson
文章目录