两个线程同时调用同一实例里面的同一方法会出问题吗?

现在有两个线程,同时运行,如果调用同一实例里面的同一方法会出问题吗。

阅读 15.3k
6 个回答

要看方法里具体是做什么了,多线程访问同一个对象要注意并发问题

千万别把并发调用就当同步问题,完全不是一个概念!

首先你搞清楚什么是生产者和消费者模型,也就是说如果没有并发的读和写,也就不符合这个模型。

有一种典型的并发调用情况就是工具类。因为类在运行时会加载到class loader中,你只要给一个输入就会对应执行后给一个输出,所以整个过程类是不会有任何变化的。

有变化的只能是内存中对象!所以当你公用一个对象,而这个对象会通过类中的方法被多次的使用,一个线程去写,另外有线程去读就会出问题。

确实要搞清楚多线程编程问题的本质。题主可能就不会问这个问题了。

凭我自己的一点理解,首先要搞清楚你问的产生的问题是什么问题,楼上的大大也都说了,其实说白了线程会出现的问题是在数据同步的问题上,再通俗点便是:同时读和写,会出现我们想不到的问题。

那现在来说你问的这种情况,调用同一实例的同一个方法,其实抽象出来就算是读取同一个实例咯,按道理来说这应该是没问题的。接下来便是这个方法的内容了,这里边有没有数据同步的问题,这就不清楚了。


归根结底线程可能出现的问题都是对数据的操作,调用方法这些其实都不是出现问题的实质,也许只是表象而已。

正常情况下没什么问题,注意两点:
01.对同一变量访问的情况,建议对必要的内容加锁;
02.不知道函数有类似static等关键词时会有什么情况;
刚入门不久,这是一些建议。

多线程操作如果要访问同一个资源,要注意死锁,同步的问题。

我给你举个栗子吧:

  1. 汽车工厂有一堆零件(data);
  2. 汽车工厂有一个组装队伍(producer)
  3. 汽车工厂有10个销售(comsumers);

零件是散乱无章的,但是一共可以组装1000台车,而且是按顺序的,组装队呢,一次就只能按需组装一个车,10个销售等着拿走去卖。

那就会有如下几个类和方法:

class parts{//汽车零件}
class carGenarator{//造车的{
   //造车方法,synchronized确保谁要就给谁造,同步进行。保证顺序(假定这个顺序就是你的业务逻辑)。
   Public synchronized Car AssembleCar(Parts parts){
   }
}}
class salers{卖车的}
{
//10个销售不停的去拿车,卖车。
}

例子可能不太直观,仅供参考吧!

推荐问题