【发布时间】:2015-08-12 13:15:12
【问题描述】:
我有一个线程场景,其中 3 个类是 MainThread.java,NormalWorkerClass1.java,NormalWorkerClass2.java
1 类:
class MainThread implements Runnable
{
private Thread thread = null;
//private variables
..
..
//default Constructor
public MainThread(){}
public MainThread(int val){
this.val=val;
}
public void start() {
thread = new Thread(this,"rootthread");
thread.start();
}
@Override
public void run() {
NormalWorkerClass1 instance1=NormalWorkerClass1.getInstance(); // Normal class
NormalWorkerClass2 instance2=NormalWorkerClass2.getInstance(); // for other working
try
{
while(true)
{
boolean retval=proccessSomething();
if(retval)
{
instance1.doMainProcess(arg..);
}
else
{
instance2.doMainProcess(arg..);
}
}
}
}
2 类:
class NormalWorkerClass1
{
private ...
private variables
public static NormalWorkerClass1 getInstance() {
return new NormalWorkerClass1();
}
public void doMainProcess(arg..)
{
Files processing()
// same common methods in NormalWorkerClass2
UtilityAccess ad=UtilityAccess.getInstance();
ad.Web Service part()
ad.dB part()
ad.Mail sending()
}
}
3 类:
class NormalWorkerClass2
{
private ...
private variables
public static NormalWorkerClass2 getInstance() {
return new NormalWorkerClass2();
}
public void doMainProcess(arg..)
{
Files processing()
// same common methods in NormalWorkerClass1
UtilityAccess ad=UtilityAccess.getInstance();
ad.Web Service part()
ad.dB part()
ad.Mail sending()
}
}
这是 3 个类。 我的疑问是:
1)在多线程环境中,即如果class 2和class 3同时访问,是否 2 和 3 类会导致任何并发问题,因为它们都使用一些通用的方法和类?
这里没有同步部分。 Web 服务部分由另一个线程部分组成。
2) 多线程访问this会发生什么,
NormalWorkerClass1 instance1=NormalWorkerClass1.getInstance(); //普通类 NormalWorkerClass2 instance2=NormalWorkerClass2.getInstance(); // 用于其他工作
因为它的 getInstance() 方法是一个静态方法, 多个线程将共享 NormalWorkerClass1 和 NormalWorkerClass2 类对象值?
5) NormalWorkerClass1 和 NormalWorkerClass2 两个类都调用相同的通用方法.. 例如 web 服务部分.. 如果线程 1 进入 web 服务部分并需要一些时间来完成.. 在那个特定时刻另一个线程 2 开始使用 web服务部分..这可能会导致整体执行出现任何问题。与邮件部分相同的情况也..会导致对象冲突的任何问题。我知道每个线程都有自己的执行堆栈并且有变量的副本
4) 此代码会导致任何性能瓶颈吗?如果是,我该如何改进此代码以用于多线程和性能改进环境。 ?
因为我是这个线程并发部分的新手..
【问题讨论】:
-
1), 2) .. 4) ?? :D 在
getInstance方法中,您返回新实例。所以每个线程都有自己的相应类的实例。你也可以只使用“new”而不是工厂方法。 -
方法(静态或其他)不存在并发问题。并发问题都围绕共享的、可变的数据。任何人都无法判断您的示例是否存在并发问题,因为......(请参阅 Nathan Hughes 的回答,了解我的目标)。
标签: java multithreading concurrency static thread-safety