关于多个线程使用同一个实例,是否影响执行速度

liunian324 发布于 2013/04/21 20:27
阅读 3K+
收藏 2

OSChina 源码之 ActionServlet 控制类

http://www.oschina.net/code/snippet_12_1?p=2#comments

有人提出这个疑问:actions 中保存着很多的action,但是各个action只保存了一个实例。
如果多个请求同时调用同一个action的同一个方法时,会不会出现问题?

假如,action中没有属性,仅仅有方法的情况下,多个线程使用同一个实例,是否影响执行速度?影响有多大?

是否可以指出java中的一些官方的说明,谢谢!以下是我的测试代码:

package com.test;

import java.util.Random;

/**
 * 测试单threadCase实例在多线程的情况下是否有影响
 * 
 * @author Administrator
 * 
 */
public class ThreadTest {
	public static void main(String[] args) {
		ThreadCase threadCase = new ThreadCase();
		for (int i = 0; i < 10; i++) {
			// ThreadCase threadCase = new ThreadCase();
			ThreadDemo threadDemo = new ThreadDemo(threadCase);
			new Thread(threadDemo, "threadDemo" + i).start();
		}
	}
}

class ThreadCase {
	public String getComplexName(String name) {
		long beginTime = System.currentTimeMillis();
		System.out.println("***getComplexName(String name) name=" + name + " beginTime=" + beginTime);
		int randomInt = 0;
		for (int i = 0; i < 1000; i++) {// 为了该方法的执行时间足够长
			for (int j = 0; j < 1000; j++) {
				Random random = new Random();
				randomInt = (randomInt + i + j + random.nextInt(100)) % 100;
			}
		}
		long endTime = System.currentTimeMillis();
		System.out.println("***getComplexName(String name) name=" + name + " beginTime=" + beginTime + " endTime=" + endTime + " costTime=" + (endTime - beginTime) + " randomInt=" + randomInt);

		return name + "-Complex" + randomInt;
	}
}

class ThreadDemo implements Runnable {
	ThreadCase threadCase;

	public ThreadDemo(ThreadCase threadCase) {
		this.threadCase = threadCase;
	}

	public void run() {
		String threadName = Thread.currentThread().getName();
		long beginTime = System.currentTimeMillis();
		System.out.println("ThreadDemo " + threadName + " begin beginTime=" + beginTime);
		String complexName = threadCase.getComplexName(threadName);
		long endTime = System.currentTimeMillis();
		System.out.println("ThreadDemo " + threadName + " end beginTime=" + beginTime + " endTime=" + endTime + " costTime=" + (endTime - beginTime) + " complexName=" + complexName);
	}
}

加载中
0
逝水fox
逝水fox

楼主需要先补补Java多线程并发的基础知识了...一个代码段又不是临界区没有同步块又没有用锁,怎么可能会有影响呢。不过线程多了线程切换之类的损耗,那是找Java也要不来说法的...

逝水fox
逝水fox
回复 @liunian324 : 本来一个对象能干的事情,非要循环一次就创建一个新对象...这个实在没法说有优点了
l
liunian324
回复 @逝水fox : 是的,其实我最想知道的是 line:13 line:15 这2行的优缺点,谢谢
逝水fox
逝水fox
回复 @liunian324 : 对象线程安全就可以多线程共享,否则每个线程单独持有一个对象,无状态这个条件是符合线程安全的
l
liunian324
这个与"线程切换"也没有关系, 其实疑问就是在 line:13 line:15 他们都一样,建议使用哪一行,各有什么优缺点,谢谢!
0
yourOnlyJack
yourOnlyJack

楼主是问该代码有没有共享资源被多线程脏读的意思吧??

看了一下代码,应该不存在该问题。每个方法都的传入参数都不影响计算,所以,相当于无参数的函数。而且没有局部变量。所以,就不存在线程的脏读问题。

如果需要使用到每个线程独立使用的资源。请参考Java标准解决方案ThreadLocal<T>。把线程相关资源放入ThreadLocal<T>里边就可以了。

0
l
liunian324

谢谢大家的关注,我比较懒, 

其实就是我想知道

line:13 以及 line:15行  

他们都是"ThreadCase threadCase = new ThreadCase();"

建议使用哪一行,各有什么优缺点,谢谢!

0
l
liunian324

引用来自“yourOnlyJack”的答案

楼主是问该代码有没有共享资源被多线程脏读的意思吧??

看了一下代码,应该不存在该问题。每个方法都的传入参数都不影响计算,所以,相当于无参数的函数。而且没有局部变量。所以,就不存在线程的脏读问题。

如果需要使用到每个线程独立使用的资源。请参考Java标准解决方案ThreadLocal<T>。把线程相关资源放入ThreadLocal<T>里边就可以了。

"楼主是问该代码有没有共享资源被多线程脏读的意思吧??"

我写的例子代码里面没有共享的变量,因此不是这个问题

0
l
liunian324

哦,错了,是有共享变量,但是 共享的这个实例里面 仅仅有方法,没有属性,因此不存在"脏读"的问题

谢谢


0
yourOnlyJack
yourOnlyJack
13行比15行好。结果一样的前提下,13比15行少创建9次对象,少分配9块内存。您说哪个好呀
0
l
liunian324

其实 既然我能敲出上面的代码,  我当然知道 15行多创建了9个实例, ThreadCase 里面没有域,仅仅非静态方法,因此 我的疑问也当然不是"产生脏读"这些,  

而是 "java的非静态方法调用,在多线程的情况下,通过同一个实例调用同一个非静态方法,有什么优缺点"

这个可能要了解java的非静态方法的一些内存模型,或其他的,其实平时我们做项目,line:13 line:15都不会出现什么大的问题,我只是想知道一些更加底层的东西,谢谢.

逝水fox
逝水fox
搞了半天是问这个...一开始写清楚多好...<深入理解java虚拟机>找这书自己看吧,这不是一两小节就讲得清楚的问题
返回顶部
顶部