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

相关推荐

    java调用json参数的webservice

    在探讨Java调用带有JSON参数的WebService之前,我们首先需要了解几个关键的技术概念:Java、JSON以及WebService。 Java是一种广泛使用的编程语言,它具有面向对象、跨平台、多线程以及健壮性等特点。Java在企业级...

    java向多线程中传递参数的三种方法详细介绍

    以下将详细介绍三种向Java多线程传递参数的方法。 1. **通过构造方法传递数据** 当创建Thread类或其子类的实例时,可以利用构造方法来传递数据。这些数据通常存储为类的成员变量,在`run()`方法中使用。例如: ``...

    NDK中C++使用POSIX线程库调用java

    通过`JNIEnv`,我们可以查找并调用Java类的方法,创建Java对象,以及传递参数和返回值。 3. **POSIX线程库(pthread)** POSIX线程库是跨平台的线程管理API,被广泛应用于C/C++编程中。在NDK中,可以使用pthread库...

    Java多线程知识点总结

    创建实现Runnable接口的实例,然后将此实例作为target参数传递给Thread类的对象,由Thread类对象代表该线程。这种方式更灵活,更被推荐使用。 在多线程编程中,线程间的同步和通信是需要特别注意的地方。Java提供了...

    JAVA 线程中启动线程

    接着,通过`Thread`类的构造函数创建一个新的线程对象,将Runnable实例作为参数传递。最后调用`start()`方法启动线程。 ```java class MyRunnable implements Runnable { public void run() { // 线程执行的代码...

    Java调用Qt DLL

    这些函数通常会接收Java对象(如`JNIEnv*`)作为参数,用于在Java和C++之间传递数据。例如,你可以定义一个JNI函数来调用Qt的GUI函数,处理窗口、按钮等。 5. **数据类型转换**:由于Java和C++的数据类型不完全相同...

    java多线程Demo

    然后创建该类的对象,并调用`start()`方法启动线程。例如: ```java class MyThread extends Thread { public void run() { // 线程任务代码 } } MyThread myThread = new MyThread(); myThread.start(); `...

    java调用com组件实例

    Java调用COM组件是Java与非Java环境交互的一种方式,主要应用于Windows平台,因为COM(Component Object Model)是微软提出的一种面向对象的技术,主要用于构建Windows应用程序和服务。在Java中调用COM组件,可以...

    C++JNI多线程回调java

    1. **初始化JNIEnv**:在C++中,我们需要获取到`JNIEnv`指针,这是JNI的核心,提供了调用Java方法和访问Java对象的接口。 2. **注册本地方法**:在`JNI_OnLoad`函数中,C++代码会注册需要的本地方法,这些方法将被...

    android中js与java间函数相互调用demo,支持中文传参,无乱码

    5. **Java调用JavaScript函数** 通过`WebView`的`loadUrl()`方法,我们可以执行JavaScript代码,从而调用JavaScript函数。例如: ```java webView.loadUrl("javascript:androidBridge.receiveFromJava('这是来自...

    在Java中创建线程有两种方法

    这些构造方法允许你传递参数,如线程名、线程组和栈大小。例如,你可以通过`Thread(Runnable target, String name)`构造方法为线程提供一个名字,使得在调试和日志记录时更容易识别。 ```java Thread myThread = ...

    Java 模拟线程并发

    另一种是实现Runnable接口,然后将Runnable对象作为参数传递给Thread类的构造函数。这种方式更符合面向接口编程的原则,避免了单继承的限制: ```java class MyRunnable implements Runnable { @Override public ...

    JS调用Android方法,向Android方法传递json数据

    这个API允许我们在Android的Java代码中创建一个对象,并暴露给JavaScript环境,使得JavaScript可以直接调用这个对象的方法。为了安全起见,从Android 4.2(API级别17)开始,所有通过`addJavascriptInterface()`暴露...

    java 多线程并发实例

    2. 实现Runnable接口:创建一个实现了Runnable接口的类,并实现run()方法,然后将这个Runnable对象作为参数传递给Thread类的构造函数,创建Thread实例并启动。这种方式更灵活,因为Java不支持多重继承,但可以实现多...

    3.jni_c++调用java中的方法

    将`JNIEnv`指针、目标对象的`jobject`、之前获取的方法ID和参数传递给这个函数。 例如,如果你有一个Java方法`public void sayHello(String name)`,在C++中调用它的过程可能如下: ```cpp jclass helloClass = ...

    java多线程经典讲义

    在Java中,可以使用Thread.currentThread()获取当前线程对象,调用getName()方法获取线程名称,或者通过setName()方法设置线程名称。此外,还可以使用带参数的Thread构造函数来初始化线程并指定名称。 多线程安全性...

    23.Java对象作为参数传递是传值还是传引用1

    在Java编程语言中,关于Java对象作为参数传递时的行为,存在一种常见的误解。许多人认为对象是按引用传递,而实际上,Java总是按值传递,包括对象。这里的“值”指的是对象的引用,而不是对象本身。这与C++或C#等...

    Java-Java面向对象中引用传递教程

    通过深入学习和实践Java中的引用传递,可以更高效地管理和操作对象,避免不必要的数据复制,同时理解其在多线程环境中的行为,以及如何在设计模式中运用这一特性。在视频教程中,这些知识点通常会结合实例进行详细...

    java多线程课件

    然后将Runnable对象传递给Thread类的构造函数,创建Thread对象,并调用start()方法启动线程。 线程的生命周期包括五个状态:创建、就绪、运行、阻塞和死亡。创建状态是线程刚刚被实例化时的状态,线程调用start()后...

Global site tag (gtag.js) - Google Analytics