现在主要是做C#开发,以前也做过JAVA,前两天抽冷子开发个记录日志的,想用静态来着,但是不知道怎么的突然觉得是不是线程不安全啊,要不用单例吧,于是用来单例。。。
但是心中疑惑不解决难受啊,最后还是看到JAVA里面有人解决说明了一下,在此总结一下吧
1、对于普通的方法都是线程安全的,只要不不是在一个方法中间让线程停下来了,都是安全的。只不过可能出现数据不一致的。多线程不是两个线程在同时跑,更不会两个线程同时跑在一个方法上。任何时刻在跑的只有一个线程,除非你把一个线程在某个方法上挂起来了,那么不同步的方法才会有另外一个线程进来到这个方法,如果这个线程把一些两个线程共同拥有的变量改变就会出问题。
2、这个静态方法本身并没有与其它线程共享资源,它用到的只是它自身的资源,线程是否安全只需要关注它用到的资源是否可能在其它线程中共用。
3、不涉及共享变量(全局/静态)永远线程安全
4、一般static而言确实是安全的,不过static方法不一定是线程安全的。和普通方法一样,一旦你传入的内容是共享的引用类型,即便是static方法,也一样不是线程安全的。
一般static,可以用C语言的想法去想。进入一个函数,会保存现场。把状态压入堆栈,然后申请了4字节寄存器,然后一直都是对这个寄存器进行操作。每次执行方法都要保存现场,重新来过,那么当然是线程安全的,但是还是上面说的,静态方法不见得是线程安全的,你的输入也有影响