关于线程的问题,清高手指点

04-06-08 Johnson_Duan
对于线程我有以下的理解,不知是否正确,请高手指点一下:

1、只要类或者类的方法没有使用公共变量,则这个类或类的方法就是线程安全的。就不需要同步。

2、入上所说得类如果是安全的,那么多个线程同事调用这个类的唯一实例和多个线程调用这个类的线程池中的实例,有什么不同,那个更好?(以上的想法是基于“每当调用类的方法时,系统会在内存中产生新的栈区,来存放这个方法的副本“这样的理解)

              

Johnson_Duan
2004-06-09 15:53
有没有人可以解答我的疑惑?

wwlhp@jdon
2004-06-10 09:17
首先说明一下线程,线程是操作系统中的概念,线程是CPU调度的最小单位。也就是说cpu会为线程a服务一小段时间,然后被调度到线程b上服务一小段时间。cpu为线程服务,实际就是执行线程的代码。线程为了记录cpu为自己执行到了什么地方,需要有一个栈stack来进行跟踪。

在某一时刻,只有一个线程是active的,因为一般只有一个cpu。

多线程访问对象很可能会出问题,比如threadA访问一个对象,做了一半cpu就被调度到threadB了,这是这个对象的状态就是“脏”的,不完整的。如果threadB也要访问同一个对象,它接手的数据就不正确,处理结果能正确么?所以线程之间也需要“沟通”-即对对象的互斥访问,也就是线程之间的一个协议,咱们都要访问这个对象可以,但是访问之前必须要获得它的锁,否则就不能访问。

Johnson_Duan
2004-06-10 23:23
首先非常感谢你的答复。就你对线程的解释我是赞成的,但就我的理解你所说的例子只是当threadA和threadB两个线程共同访问的对象的属性也就是两个线称共享数据时才会需要互斥访问,而我第二个问题的意思是,两个线程同时调用对象的方法,而这个方法没有使用到对象的属性,并且系统会为每个调用单独开一个栈区存放被调用的方法的副本,也就不会有共享数据的情况出现,也就是被调用的方法是线程安全的。

还请各位帮忙指点一下。

yangzheng
2004-06-11 13:06
线程安全一般是和你要访问的singleton对象联系在一起的的。如果该对象不是singleton的话,可以不用考虑线程安全的。

当然对于类的static变量,即使不考虑线程安全,也要注意它是所有同类型对象共享的。

猜你喜欢
7Go 1 2 3 4 ... 7 下一页