ThreadLocal与synchronized多线程并发访问区别2

ThreadLocal与synchronized多线程并发访问区别2

ID:38334009

大小:38.00 KB

页数:5页

时间:2019-06-10

ThreadLocal与synchronized多线程并发访问区别2_第1页
ThreadLocal与synchronized多线程并发访问区别2_第2页
ThreadLocal与synchronized多线程并发访问区别2_第3页
ThreadLocal与synchronized多线程并发访问区别2_第4页
ThreadLocal与synchronized多线程并发访问区别2_第5页
资源描述:

《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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。