问题描述
按自己的理解,线程执行,其中基本数据类型是放置于stack中,但引用堆中对象,当在方法中调用其他方法参数为对象时,是否每个对象针对线程唯一,是否线程安全,求赐教 问题补充:public class Business1 {public void method1(){System.out.println(Thread.currentThread().getName());User user = new User();user.setId(123456l);user.setUserName("showlike");user.setUserPwd("123456");user.setEmail("showlike@168.com");method2(user);System.out.println(Thread.currentThread().getName()+","+user.getEmail());}public void method2(User user){user.setEmail("showlike@189.com"+Thread.currentThread().getName());}}public class ManyThread {/** * @author showlike * @param args * @date 2014-8-1 上午09:58:31 */public static void main(String[] args) {final Business1 business = new Business1();for(int i = 0;i<100;i++){new Thread() { public void run() { business.method1(); } }.start();}}} 业务场景有点类似上面代码,运行未看到有多线程安全问题,还不是很明白线程内对象创建是否生命周期也是随线程结束而结束,未查到此方面资料,还望大牛们指点 ,谢!!!
解决方案
在你的例子中,每个user被封装在单独的thread中,即线程封装,这样是安全的。原因:无共享内存的操作。“线程内对象创建是否生命周期也是随线程结束而结束”,答案:在线程外该对象未被引用,线程结束后,该对象可视为已无用/已结束,后续GC将回收(与局部变量一样)。另:建议去看看并发编程的书吧。
解决方案二:
引起线程安全的考虑,其前提是:共享内存(共享对象),且对其进行修改。若多线程访问共享对象,但不修改其属性,则不需考虑线程安全;若多线程操作共享对象,即修改其属性,则须考虑线程安全。另针对“每个对象针对线程唯一”问题:若传递共享对象,则不唯一;若传递非共享对象,则唯一。
解决方案三:
看你的对象是否多线程共享的,如果不共享肯定安全!
解决方案四:
方法调用和线程有什么关系,又没有启动新的线程。传递的是对象的引用。指向对重的对象,只有一个。 线程不安全。