关于线程安全:
如果某函数是不可重入的,则它不是线程安全的!
至于是否可重入,就可以根据这个函数是否使用了静态存储的数据判断了!

从语意上说,静态存储数据包括全局变量和局部静态变量,它们都是存储在堆上的.而线程间是共享同一进程空间的,所以它们共享相同的静态存储数据, 所以...
对于可重入函数来说,如果下一次函数调用对上一次调用产生影响的话,那么该函数就是不可重入函数了.
楼主,你的说法有些不妥吧?
==========================================================================
在.NET开发中,保持线程安全的默认手段是采用System.Threading.Monitor加锁以确保对共享数据访问的同步性。我们已经很习惯于用SyncLock语句来实现这个功能。但是锁住什么变量也是有讲究的。如果一个线程过程所用的同步变量被别的过程锁住而又不放开的话,这个线程就会陷入永久的沉睡。普遍方案是:

1、锁住被访问的数据本身。对于只存在一种线程过程的情况可以使用,但若有很多种不同的线程过程都要访问这数据,就很危险了。

2、锁住容器的实例。常见是锁住thMe。也有锁住Me.GetType()的,都是相似的原理。这种方法的最大缺陷就是Me尤其是Me.GetType()都是可以被对象外部访问到的对象,如果从外部锁住他们而且不放开,对象内的线程就被锁死了。这是相当危险的。

3、锁住特殊的同步根。常常是类型的字段,没有任何功能,只是用来维持同步的。这种变量从外部是无法锁住的,但类内部的其他过程仍可锁住他们,导致死锁。

所以我想出一种方案:锁住局部静态变量。如下所示:

Static syncRoot As New Object()
LyncLock syncRoot
    'Code
End SyncLock

局部静态是无法被其他过程访问的,因此这个同步根就成了本线程过程专用的。不用担心任何其他人可以锁住它。而局部静态变量的生命周期与类的字段一样,完全可以胜任这个工作。