0 0

java方法内调用方法,参数传递对象是否线程安全5

    按自己的理解,线程执行,其中基本数据类型是放置于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();
}
}
}

    业务场景有点类似上面代码,运行未看到有多线程安全问题,还不是很明白线程内对象创建是否生命周期也是随线程结束而结束,未查到此方面资料,还望大牛们指点 ,谢!!!
2014年7月31日 14:45

4个答案 按时间排序 按投票排序

0 0

采纳的答案

在你的例子中,每个user被封装在单独的thread中,即线程封装,这样是安全的。
原因:无共享内存的操作。

“线程内对象创建是否生命周期也是随线程结束而结束”,答案:在线程外该对象未被引用,线程结束后,该对象可视为已无用/已结束,后续GC将回收(与局部变量一样)。

另:
建议去看看并发编程的书吧。

2014年8月01日 14:53
0 0

引起线程安全的考虑,其前提是:共享内存(共享对象),且对其进行修改。
若多线程访问共享对象,但不修改其属性,则不需考虑线程安全;
若多线程操作共享对象,即修改其属性,则须考虑线程安全。

另针对“每个对象针对线程唯一”问题:
若传递共享对象,则不唯一;
若传递非共享对象,则唯一。

2014年7月31日 16:18
0 0

看你的对象是否多线程共享的,如果不共享肯定安全!

2014年7月31日 16:15
0 0

方法调用和线程有什么关系,又没有启动新的线程。
传递的是对象的引用。指向对重的对象,只有一个。 线程不安全。

2014年7月31日 15:20

相关推荐

    JNI技术手册 c/c++调用java

    II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统中有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 ...

    Java并发理论,如何理解线程安全.docx

    当多个线程访问同一个对象时,如果不用考虑这些线程在运行环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那么这个对象时线程的 ...

    java 多线程编程实例

    内容是两个多线程编程的demo: 1.一个线程添加,一个线程减少 2.a线程呼叫b线程,b线程呼叫c线程,c线程呼叫a线程。 ...变量传递到各个线程中去,让线程去调用即可。 使用方法: 导入eclipse即可。

    Java开发技术大全(500个源代码).

    invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用方法示例 invokeOther.java 类的外部调用方法示例 invokeStaticMethod.java 调用静态方法...

    JAVA面试基础知识题

    25、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递...

    超级有影响力霸气的Java面试题大全文档

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 17、...

    Java并发编程(学习笔记).xmind

    将对象封装到线程安全对象中 由特定锁保护 保护对象的方法 对象的组合 设计线程安全的类 实例封闭 线程安全的委托 委托是创建线程安全类的最有效策略,只需要让现有的线程安全类管理所有...

    基础深化和提高-Java多线程技术

    然后可以创建该类的实例并调用start()方法启动线程。 java class MyThread extends Thread { public void run() { // 线程执行逻辑 } } // 创建并启动线程 MyThread myThread = new MyThread(); myThread.start...

    JAVA面试题最全集

    一、Java基础知识 1.Java有那些基本数据类型,String是不是基本...这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() ...

    Java多线程Callable接口

    在Java SE5中引入的Callable是一种具有类型参数的泛型,它的类型参数表示的是从方法call()中返回的值,并且必须使用ExecutorService.submit()方法调用它。 import java.util.ArrayList; import java.util....

    java 面试题 总结

    wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 14、Overload...

    Java的线程安全与不安全集合.docx

    使用Collections.synchronizedList(new ArrayList()):内部直接将接受的List对象传递给静态内部类SynchronizedList对象,然后Collections.synchronizedList(new ArrayList())返回的List对象的调用方法都是直接调用...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.9.4 在构造方法中调用构造方法 184 7.10 方法大汇总 185 7.10.1 本例中用到的类 186 7.10.2 使用例程将本章的知识穿起来 189 7.11 小结:多方位理解Java方法 191 7.12 习题 192 第8章 Java中的包(Package)...

    java 编程入门思考

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    Java初学者入门教学

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

    JAVA语言程序设计【高清版】.pdf

    64 5.2.2 默认的构造方法 66 5.3 定义方法 67 5.3.1 方法定义格式 68 5.3.2 按值传递 71 5.4 类的继承 72 5.4.1 继承的定义 73 5.4.2 多态性与转换对象 74 5.5 继续讨论Java的关键字 77 5.5.1 ...

    java联想(中文)

    A.1.3 传递和使用Java对象 A.1.4 JNI和Java违例 A.1.5 JNI和线程处理 A.1.6 使用现成代码 A.2 微软的解决方案 A.3 J/Direct A.3.1 @dll.import引导命令 A.3.2 com.ms.win32包 A.3.3 汇集 A.3.4 编写回调函数 A.3.5 ...

Global site tag (gtag.js) - Google Analytics