Java: ThreadLocal类
程序员文章站
2024-01-18 20:15:52
...
一个项目中最重要的就是资源的连接信息, 例如数据库
使用ThreadLocal类 可以明确标记出每一个线程的具体的对象信息, 实际上是在数据保存的时候多保存了一个currentThread, 不过此类有局限
本类定义:
public class ThreadLocal<T> extends Object
重要方法
取得数据: (取一个)
public T get();
保存数据: (存一个)
public void set(T value);
删除数据
public void remove();
范例
package com.cwq.beyond;
class Message{
private String note;
public void setNote(String note) {
this.note = note;
}
public String getNote() {
return note;
}
}
class MessageConsumer{
public void print() {
System.out.println(Thread.currentThread().getName()+" = "+MyUtil.message.getNote());
}
}
class MyUtil{
public static Message message;
}
public class TestDemoTwo {
public static void main(String[] args) throws Exception{
new Thread(()->{
Message message = new Message();
message.setNote("I am a student!");
MyUtil.message = message;
new MessageConsumer().print();
},"用户A") .start();
new Thread(()->{
Message message = new Message();
message.setNote("I am a teacher!");
MyUtil.message = message;
new MessageConsumer().print();
},"用户B") .start();
}
}
出现问题 (线程没有同步)
使用 ThreadLocal 类进行实现
package com.cwq.beyond;
class Message{
private String note;
public void setNote(String note) {
this.note = note;
}
public String getNote() {
return note;
}
}
class MessageConsumer{
public void print() {
System.out.println(Thread.currentThread().getName()+" = "+MyUtil.get().getNote());
}
}
class MyUtil{
private static ThreadLocal<Message> threadLocal = new ThreadLocal<Message>();
public static Message get() {
return threadLocal.get();
}
public static void set(Message msg) {
threadLocal.set(msg);
}
}
public class TestDemoTwo {
public static void main(String[] args) throws Exception{
new Thread(()->{
Message message = new Message();
message.setNote("I am a student!");
MyUtil.set(message);
new MessageConsumer().print();
},"用户A") .start();
new Thread(()->{
Message message = new Message();
message.setNote("I am a teacher!");
MyUtil.set(message);
new MessageConsumer().print();
},"用户B") .start();
}
}
上一篇: mysql联合查询二张表的数据
下一篇: SQL提高查询效率一些方法总结