我有一个Thread scenerio,其中3个类是MainThread.java,NormalWorkerClass1.java,NormalWorkerClass2.java
1班:
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()
}
}
2课程:
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课程:
function insertcsv(){
$db = new DB();
$csvArr = $db->csvToArray($this->csvfile);
foreach($csvArr as $csvArrData) {
$checksku = "Select * from product where sku='".$csvArrData['sku']."'";//check this sku is already in table
$resultsku = $db->query($checksku);
if(!empty($resultsku)){
echo "<pre>"; print_r($resultsku); exit;
} else {
$sql = "INSERT INTO `product`(`name`, `description`, `short_description`, `sku`, `weight`, `visibility`, `price`, `tax_class`, `image`, `quantity`, `stock_availability`, `category`, `product_status`, `status`, `date_time`) VALUES ('".mysql_real_escape_string($csvArrData['name'])."','".mysql_real_escape_string($csvArrData['description'])."','".mysql_real_escape_string($csvArrData['short_description'])."','".mysql_real_escape_string($csvArrData['sku'])."','".mysql_real_escape_string($csvArrData['weight'])."','".mysql_real_escape_string($csvArrData['visibility'])."','".mysql_real_escape_string($csvArrData['price'])."','".mysql_real_escape_string($csvArrData['tax_class_id'])."','".mysql_real_escape_string($csvArrData['image'])."','".mysql_real_escape_string($csvArrData['qty'])."','".mysql_real_escape_string($csvArrData['is_in_stock'])."','".mysql_real_escape_string($csvArrData['_category'])."','".mysql_real_escape_string($csvArrData['status'])."','Y',now())";
$result = $db->query($sql);
}
}
return($result);
}
这是3个班级。 我的怀疑是:
1)在多线程环境中,即同时访问类2和类3,是否 2和3类会导致任何并发问题,因为它们都使用了一些常用的方法和类?
此处没有同步部分。 Web服务部分由另一个线程部分组成。
2)多线程访问时会发生什么,
NormalWorkerClass1 instance1 = NormalWorkerClass1.getInstance(); //普通班 NormalWorkerClass2 instance2 = NormalWorkerClass2.getInstance(); //用于其他工作
因为它的getInstance()方法是静态方法, 多个线程将共享NormalWorkerClass1和NormalWorkerClass2类对象值?
5)两个类NormalWorkerClass1和NormalWorkerClass2调用相同的常用方法..例如,web服务部分..如果一个thread1进入Web服务部分并需要一些时间来完成..在那个特定时刻另一个thread2来使用web服务部分......这可能会导致总执行中出现任何问题。与邮件部分相同的情况也将...在对象冲突中引起任何问题。我知道每个线程都有自己的堆栈可供执行,并有变量副本
4)此代码是否会导致任何性能瓶颈?如果是,我如何改进此代码以实现多线程和性能改进环境。 ?
因为我是这个线程并发部分的新手..
答案 0 :(得分:6)
并发性导致问题的原因是当多个线程访问共享状态时,您的示例没有任何共享状态,它只显示返回新事物的静态方法。如果你添加同时访问的静态类变量,那么你将不得不担心线程覆盖彼此的线程安全问题&#39;工作或其他线程看不到的更改。
调用方法本身并不会引入并发问题,访问和更改实例和类变量的内容是导致问题的原因。
答案 1 :(得分:0)
run()
方法触及MainThread
类的任何实例变量,可能会出现并发问题。
还有一件事 - 可能很明显,也许不是:并发是关于线程而不是类。 NormalWorkerClass1
和NormalWorkerClass2
在从同一个线程调用时不会相互冲突。