ThreadLocal类解决多线程同步问题

问题引出

我之前写了一篇文章Java学习日记——从多线程到生产者消费者模式在这篇文章之中,我简单总结了多线程的一些用法,当谈到线程同步问题时我使用了sychronized关键字进行处理。这篇文章我将从Java提供的一个类来从另一个角度去解决。
我们简单写一段代码,创建三个线程获取信息,代码如下

package dataStructure;

public class ThreadLocalDemo {
     
	public static void main(String[] args) {
     
		new Thread(()->{
     Message msg = new Message() ;
		msg.setInfo("第一个线程");
		Channel.setMessage(msg);
		Channel.send();} , "线程A").start();
		
		new Thread(()->{
     Message msg = new Message() ;
		msg.setInfo("第二个线程");
		Channel.setMessage(msg);
		Channel.send();} , "线程B").start();
		
		new Thread(()->{
     Message msg = new Message() ;
		msg.setInfo("第三个线程");
		Channel.setMessage(msg);
		Channel.send();} , "线程C").start();
		
	}
}

class Message{
     
	private String info ;
	public void setInfo(String info){
     
		this.info = info ;
	}
	public String getInfo(){
     
		return this.info ;
	}
}

class Channel{
     
	private static Message message ;
	private Channel(){
     }
	public static void setMessage(Message m){
     
		message = m ;
	}
	public static void send(){
     
		System.out.println("【" + Thread.currentThread().getName() + "发送消息:】" + message.getInfo());
	}
}

【线程A发送消息:】第二个线程
【线程C发送消息:】第二个线程
【线程B发送消息:】第二个线程

通过运行结果我们可以看到出现了不同步的问题,问题在于我们线程设置消息是通过静态Message设置的,当第一个线程设置了对象之后还没来得及发送,第二个线程也进来设置对象了。那么这个时候我们就需要有一个区域来保存每一个线程自己的message对象

使用ThreadLocal对象

class Channel{
     
	private static final ThreadLocal<Message> THREADLOCAL = new ThreadLocal<Message>() ;
	private static Message message ;
	private Channel(){
     }
	public static void setMessage(Message m){
     
		THREADLOCAL.set(m); ;
	}
	public static void send(){
     
		System.out.println("【" + Thread.currentThread().getName() + "发送消息:】" + THREADLOCAL.get().getInfo());
	}
}

【线程B发送消息:】第二个线程
【线程A发送消息:】第一个线程
【线程C发送消息:】第三个线程

我们在Channel类中使用ThreadLocal设置一个常量,利用ThreadLocal的set()和get()方法来获取数据。同步问题被解决了!

你可能感兴趣的:(Java学习日记,多线程,java)