2.java线程之ThreadLocal

本文介绍ThreadLocal机制,通过示例代码展示如何利用ThreadLocal为每个线程创建独立的日志记录器,有效避免线程间数据干扰,降低同步开销。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ThreadLocal即线程本地化变量,使用场合主要解决多线程中数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,但是大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。

下面的例子是实现日志记录的功能,每个线程都有对应的日志文件。

 

 1 package com.thread.test;
 2 
 3 import java.io.IOException;
 4 import java.util.logging.FileHandler;
 5 import java.util.logging.Level;
 6 import java.util.logging.Logger;
 7 
 8 public class ThreadLogger {
 9 
10     private static final ThreadLocal<Logger> threadLocal = new ThreadLocal<Logger>();
11     
12     public static void log(String msg){
13         getThreadLogger().log(Level.INFO,msg);
14     }
15     
16     /**
17      * 从ThreadLocal中获取当前线程对应的Logger对象,如果ThreadLocal中没有保存当前线程对应的Logger对象
18      * 则新建一个Logger对象,并放入ThreadLocal中。
19      * @return
20      */
21     public static Logger getThreadLogger(){
22         Logger logger = threadLocal.get();    // 获取当前线程的Logger对象
23         if(logger == null){
24             logger = Logger.getLogger(Thread.currentThread().getName());
25             try {
26                 logger.addHandler(new FileHandler(Thread.currentThread().getName() + ".log"));
27             } catch (SecurityException e) {
28                 e.printStackTrace();
29             } catch (IOException e) {
30                 e.printStackTrace();
31             }
32             
33             threadLocal.set(logger);    //添加副本
34         }
35         
36         return logger;
37     }
38 }

 

 

 

 

 1 package com.thread.test;
 2 
 3 public class Main {
 4 
 5     
 6     public static void main(String[] args) {
 7         /*MyThread myThread = new MyThread();
 8         new Thread(myThread).start();
 9         new Thread(myThread).start();*/
10         
11         new TestThread("t1").start();
12         new TestThread("t2").start();
13         new TestThread("t3").start();
14     }
15 
16 }
17 
18 class TestThread extends Thread{
19     
20     public TestThread(String name) {
21         super(name);
22     }
23     
24     @Override
25     public void run() {
26         for(int i=1;i<5;i++){
27             ThreadLogger.log(getName()+":message"+i);
28         }
29     }
30 }

 

---------------------------------------------------- 誑逩の蝸犇 : I believe Nothing is impossible. ----------------------------------------------------

转载于:https://www.cnblogs.com/cody1988/archive/2011/10/17/2215116.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值