多线程会导致静态方法的并发问题吗?

时间:2015-08-12 13:15:12

标签: java multithreading concurrency static thread-safety

我有一个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)此代码是否会导致任何性能瓶颈?如果是,我如何改进此代码以实现多线程和性能改进环境。 ?

因为我是这个线程并发部分的新手..

2 个答案:

答案 0 :(得分:6)

并发性导致问题的原因是当多个线程访问共享状态时,您的示例没有任何共享状态,它只显示返回新事物的静态方法。如果你添加同时访问的静态类变量,那么你将不得不担心线程覆盖彼此的线程安全问题&#39;工作或其他线程看不到的更改。

调用方法本身并不会引入并发问题,访问和更改实例和类变量的内容是导致问题的原因。

答案 1 :(得分:0)

内森的休斯回答是正确的。我想补充一点,如果run()方法触及MainThread类的任何实例变量,可能会出现并发问题。

还有一件事 - 可能很明显,也许不是:并发是关于线程而不是类。 NormalWorkerClass1NormalWorkerClass2在从同一个线程调用时不会相互冲突。