Java多线程之ThreadLocal[Java编程]
本文“Java多线程之ThreadLocal[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
ThreadLocal的核心机惟很简单:为每个独立的线程供应一个变量的副本.
Java供应的synchronized关键字利用了“同步锁”的机制来禁止线程的竞争拜候,即“以时间换空间”.: " 10pt; FONT-SIZE:> ThreadLocal则利用了“拷贝副本”的方法,大家有份,你用你的,我用我的,大家互不影响,是“以空间换时间”.每个线程改正变量时,实际上改正的是变量的副本,不怕影响到别的线程.
为了加深对ThreadLocal的理解,下面我利用一个例子来演示ThreadLocal若何断绝线程间的变量拜候和改正:
【1】SerialNum类
packageexample.thread.threadLocal;
publicclassSerialNum{
privatestaticintnextSerialNum=1;
@SuppressWarnings("unchecked")
privatestaticThreadLocalserialNum=newThreadLocal(){
protectedsynchronizedObjectinitialValue(){
returnnewInteger(nextSerialNum++);
}
};
publicstaticintget(){
return((Integer)(serialNum.get())).intValue();
}
@SuppressWarnings("unchecked")
publicstaticvoidset(IntegernewSerial){
serialNum.set(newSerial);
}
}
【2】GetSerialNumThread
packageexample.thread.threadLocal;
publicclassGetSerialNumThreadimplementsRunnable{
publicstaticvoidmain(Stringargs[]){
GetSerialNumThreadserialNumGetter=newGetSerialNumThread();
Threadt1=newThread(serialNumGetter,"ThreadA");
Threadt2=newThread(serialNumGetter,"ThreadB");
t1.start();
try{
t1.join();
}catch(InterruptedExceptione){
e.printStackTrace();
}
t2.start();
}
publicvoidrun(){
intmySerialNum=getSerialNum();
System.out.println("线程"+Thread.currentThread().getName()
+"获得到的序列号是"+mySerialNum);
System.out.println("线程"+Thread.currentThread().getName()
+"改正了序列号为"+(mySerialNum*3));
setSerialNum(mySerialNum*3);
System.out.println("线程"+Thread.currentThread().getName()
+"再次得到的序列号是"+getSerialNum());
}
privateintgetSerialNum(){
returnSerialNum.get();
}
privatevoidsetSerialNum(intnewSerialNum){
SerialNum.set(newInteger(newSerialNum));
}
}
运行的后果以下:
线程 Thread A 获得到的序列号是1
线程 Thread A 改正了序列号为3
线程 Thread A 再次得到的序列号是3
线程 Thread B 获得到的序列号是2
线程 Thread B 改正了序列号为6
线程 Thread B 再次得到的序列号是6
以上是“Java多线程之ThreadLocal[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |