java核心知识点学习---多线程间的数据共享和对象独立,t

线程内的数据共享与对象独立,举例:张三给李四转钱,开启A线程去执行转钱这个动作,刚好同时王五给赵六转钱,开启B线程去执行转钱,因为是调用的同样一个动作或者说对象,所以如果不能保证线程间的对象独立,那么很有可能发生,张三给李四转钱时把王五转给赵六的转钱一块提交了,而王五转钱整个动作还未完成,那么就造成了转钱错误,所以线程间一方面要保证数据的共享,另一方面要保证对象的对立.1.用Map封装对象以数据实现共享packagecom.amos.concurrent;importjava.util.HashMap;importjava.util.Map;importjava.util.Random;/***@ClassName:ThreadScopeShareData*@Description:下面的例子用的是Map对象将数据实现共享*@author:amosli*@email:hi_amos@outlook.com*@dateApr20,20146:19:02PM*/publicclassThreadScopeShareData{publicstaticMap<Object,Integer>map=newHashMap<Object,Integer>();publicstaticvoidmain(String[]args){for(inti=0;i<3;i++){newThread(newRunnable(){publicvoidrun(){intdata=newRandom().nextInt();//给data设值,System.out.println(Thread.currentThread().getName()+"setdata:"+data);map.put(Thread.currentThread(),data);//将值按照Thread去设值,取的时候也按Thread去取,以保证数据的共享,但又保证了对象的独立.newA().get();newB().get();}}).start();}}staticclassA{//这里A和B的方法虽然是一样的,这里是想表示有可能调用不同的对象去执行数据操作publicintget(){---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---data=map.get(Thread.currentThread());System.out.println("afromthread:"+Thread.currentThread().getName()+"is"+data);returndata;}}www.jnmu8.comstaticclassB{publicintget(){intdata=map.get(Thread.currentThread());System.out.println("bfromthread:"+Thread.currentThread().getName()+"is"+data);returndata;}}}运行效果:2.使用ThreadLocal实现数据共享创建ThreadLocal,可以直接new出来,其设值支技泛型,newThreadLocal<T>,如下将上面代码改写:publicclassThreadLocalShareData{privatestaticThreadLocal<Integer>threadLocal=newThreadLocal<Integer>();publicstaticvoidmain(String[]args){for(inti=0;i<3;i++){---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---newThread(newRunnable(){publicvoidrun(){intdata=newRandom().nextInt();//给data设值,System.out.println(Thread.currentThread().getName()+"setdata:"+data);threadLocal.set(data);//使用ThreadLocal来设值newA().get();newB().get();}}).start();}}staticclassA{//这里A和B的方法虽然是一样的,这里是想表示有可能调用不同的对象去执行数据操作publicintget(){intdata=threadLocal.get();System.out.println("afromthread:"+Thread.currentThread().getName()+"is"+data);returndata;}}classB.......}下面是ThreadLocalset(Tvalue)方法的源码:publicvoidset(Tvalue){Threadt=Thread.currentThread();ThreadLocalMapmap=getMap(t);if(map!=null)www.qqok8.commap.set(this,value);elsecreateMap(t,value);}这里同样是用Map方式的设值,只不过又封装了一层ThreadLocalMap.查看其ThreadLocalget()方法的源码:publicTget(){Threadt=Thread.currentThread();---本文来源于网络,仅供参考,勿照抄,如有侵权请联系删除---ThreadLocalMapmap=getMap(t);if(map!=null){ThreadLocalMap.Entrye=map.getEntry(this);if(e!=null)return(T)e.value;}returnsetInitialValue();}同样是通过与线程绑定,取值的.3.实例测试packagecom.amos.concurrent;classAccount{/**定义一个ThreadLocal类型的变量,该变量是一个线程局部变量*/privateThreadLocal<String>name=newThreadLocal<String>();//定义一个初始化name属性的构造器publicAccount(Stringstr){this.name.set(str);//下面的代码用于访问当前线程的name副本的值System.out.println("------"+this.name.get());}//name的getter,setter方法publicStr...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供参考,付费前请自行鉴别。
3、如文档内容存在侵犯商业秘密、侵犯著作权等,请点击“举报”。

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

客服邮箱:

biganzikefu@outlook.com

所有的文档都被视为“模板”,用于写作参考,下载前须认真查看,确认无误后再购买;

文档大部份都是可以预览的,笔杆子文库无法对文档的真实性、完整性、准确性以及专业性等问题提供审核和保证,请慎重购买;

文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为依据;

如果您还有什么不清楚的或需要我们协助,可以联系客服邮箱:

biganzikefu@outlook.com

常见问题具体如下:

1、问:已经付过费的文档可以多次下载吗?

      答:可以。登陆您已经付过费的账号,付过费的文档可以免费进行多次下载。

2、问:已经付过费的文档不知下载到什么地方去了?

     答:电脑端-浏览器下载列表里可以找到;手机端-文件管理或下载里可以找到。

            如以上两种方式都没有找到,请提供您的交易单号或截图及接收文档的邮箱等有效信息,发送到客服邮箱,客服经核实后,会将您已经付过费的文档即时发到您邮箱。

注:微信交易号是以“420000”开头的28位数字;

       支付宝交易号是以“2024XXXX”交易日期开头的28位数字。

笔杆子文秘
机构认证
内容提供者

为您提供优质文档,供您参考!

确认删除?