|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你精通任何一门语言就最强大。现在来看,java的市场比C#大,C#容易入手,比较简单,java比较难
5、你有我有全都有——ThreadLocal怎样办理并发平安性?
后面我们先容了Java傍边多个线程抢占一个共享资本的成绩。但不管是同步仍是重进锁,都不克不及实其实在的办理资本紧缺的情形,这些计划只是靠制订划定规矩来束缚线程的举动,让它们不再冒死的争抢,而不是真正从本色上办理他们对资本的需求。
在JDK1.2傍边,引进了java.lang.ThreadLocal。它为我们供应了一种全新的思绪来办理线程并发的成绩。可是他的名字不免让我们看文生义:当地线程?
甚么是当地线程?
当地线程开顽笑的说:不要沉沦哥,哥只是个传说。
实在ThreadLocal并不是ThreadatLocal,而是LocalVariableinaThread。
依据WikiPedia上的先容,ThreadLocal实际上是源于一项多线程手艺,叫做ThreadLocalStorage,即线程当地存储手艺。不单单是Java,在C++、C#、.NET、Python、Ruby、Perl等开辟平台上,该手艺都已得以完成。
当利用ThreadLocal保护变量时,它会为每一个利用该变量的线程供应自力的变量正本。也就是说,他从基本上办理的是资本数目的成绩,从而使得每一个线程持有绝对自力的资本。如许,当多个线程举行事情的时分,它们不必要纠结于同步的成绩,因而功能便年夜年夜提拔。但资本的扩大带来的是更多的空间损耗,ThreadLocal就是如许一种使用空间来调换工夫的办理计划。
说了这么多,来看看怎样准确利用ThreadLocal。
经由过程研讨JDK文档,我们晓得,ThreadLocal中有几个主要的办法:get()、set()、remove()、initailValue(),对应的寄义分离是:
前往此线程部分变量确当前列程正本中的值、将此线程部分变量确当前列程正本中的值设置为指定值、移除此线程部分变量以后线程的值、前往此线程部分变量确当前列程的“初始值”。
还记得我们在第三篇的上半节引出的谁人例子么?几个线程修正统一个Student对象中的age属性。为了包管这几个线程可以事情一般,我们必要对Student的对象举行同步。
上面我们对这个程序举行一点小小的改革,我们经由过程承继Thread来完成多线程:
/**
*
* @author x-spirit
*/
public class ThreadDemo3 extends Thread{
private ThreadLocal<Student> stuLocal = new ThreadLocal<Student>();
public ThreadDemo3(Student stu){
stuLocal.set(stu);
}
public static void main(String[] args) {
Student stu = new Student();
ThreadDemo3 td31 = new ThreadDemo3(stu);
ThreadDemo3 td32 = new ThreadDemo3(stu);
ThreadDemo3 td33 = new ThreadDemo3(stu);
td31.start();
td32.start();
td33.start();
}
@Override
public void run() {
accessStudent();
}
public void accessStudent() {
String currentThreadName = Thread.currentThread().getName();
System.out.println(currentThreadName + " is running!");
Random random = new Random();
int age = random.nextInt(100);
System.out.println("thread " + currentThreadName + " set age to:" + age);
Student student = stuLocal.get();
student.setAge(age);
System.out.println("thread " + currentThreadName + " first read age is:" + student.getAge());
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println("thread " + currentThreadName + " second read age is:" + student.getAge());
}
}
<p>
到时我们不用学struts,不用学spring,不用学Hibernate,只要能把jsf学会了,完全可以替代所有的框架,包括AJAX,都知道AJAX并不是新技术,虽说我没深入学习jsf但我认为jsf应该已经能通过其它技术替代AJAX,实现无缝刷新。 |
|