欢迎来到天天文库
浏览记录
ID:38334009
大小:38.00 KB
页数:5页
时间:2019-06-10
《ThreadLocal与synchronized多线程并发访问区别2》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、由上面可以知道,使用同步是非常复杂的。并且同步会带来性能的降低。Java提供了另外的一种方式,通过ThreadLocal可以很容易的编写多线程程序。从字面上理解,很容易会把ThreadLocal误解为一个线程的本地变量。其它ThreadLocal并不是代表当前线程,ThreadLocal其实是采用哈希表的方式来为每个线程都提供一个变量的副本。从而保证各个线程间数据安全。每个线程的数据不会被另外线程访问和破坏。我们把第一个例子用ThreadLocal来实现,但是我们需要些许改变。Student并不是一个私有
2、变量了,而是需要封装在一个ThreadLocal对象中去。调用ThreadLocal的set方法,ThreadLocal会为每一个线程都保持一份Student变量的副本。所以对student的读取操作都是通过ThreadLocal来进行的。Java代码1.protectedStudentgetStudent(){ 2. Studentstudent=(Student)studentLocal.get(); 3. if(student==null){ 4. student=n
3、ewStudent(); 5. studentLocal.set(student); 6. } 7. returnstudent; 8.} 9. 10.protectedvoidsetStudent(Studentstudent){ 11. studentLocal.set(student); 12.} accessStudent()方法需要做一些改变。通过调用getStudent()方法来获得当前线程的Student变量,如果当前线程不存在一个Stude
4、nt变量,getStudent方法会创建一个新的Student变量,并设置在当前线程中。 Studentstudent=getStudent(); student.setAge(age);accessStudent()方法中无需要任何同步代码。完整的代码清单如下:TreadLocalDemo.javaJava代码1.publicclassTreadLocalDemoimplementsRunnable{ 2. privatefinalstatic ThreadLocalstudentLoc
5、al=newThreadLocal(); 3. 1. publicstaticvoidmain(String[]agrs){ 2. TreadLocalDemotd=newTreadLocalDemo(); 3. Threadt1=newThread(td,"a"); 4. Threadt2=newThread(td,"b"); 5. 6. t1.start(); 7. t2.start();
6、 8. 9. 10. 11. 12. } 13. 14. /*(non-Javadoc)15. *@seejava.lang.Runnable#run()16. */ 17. publicvoidrun(){ 18. accessStudent(); 19. } 20. 21. public void accessStudent(){ 22. 23.
7、 StringcurrentThreadName=Thread.currentThread().getName(); 24. System.out.println(currentThreadName+"isrunning!"); 25. Randomrandom=newRandom(); 26. intage=random.nextInt(100); 27. System.out.println("thread"+currentThrea
8、dName+"setageto:"+age); 28. Studentstudent=getStudent(); 29. student.setAge(age); 30. System.out.println("thread"+currentThreadName+"first readageis:"+student.getAge()); 31. try{ 32
此文档下载收益归作者所有