觉得说的啰嗦的,可以直接看“三、结论”那段

一、static关键字的理解

         被static修饰的变量或者方法,可以被当前工程的任意类在任意地方使用。

         这是因为,它们被放入到了JVM堆中的永久代里面

         因此,带static关键字的内容不会被回收,不会被重复分配内存,直至服务下次被重启。。。

二、静态与非静态锁的区别

         这里说的锁,只是狭隘的指代“synchronized”关键字。

         众所周知的是,被这个关键字修饰的非静态方法,我称其为方法锁;加在方法内某段代码中的,我称其为局部锁。

         局部锁与方发锁的区别,就是锁的粒度的大小。粒度越小,影响范围越小,对业务整体的干扰也就越小。

         如果我们只对某个类的一个方法加锁,那么这个类中的其他方法是不受到锁的制约的

         这个类的其他方法仍然保证了并发性能

         synchronized加锁的核心,是对某个类的当前实例进行加锁,防止其他线程对同一实例的当前方法的访问。

         但是,如果是其他线程对这个类的不同实例的访问,就不受锁的限制和影响了。

 

         但是,当我们在方法上引入了static这个家伙的时候,一切就变得不同了。

         因为上面我们说过了,被static修饰的对象,其实是生存于永久代中,那么,当我们对这种方法加锁的时候

         就相当于锁住了类本身。因此对于这个被synchronized修饰的方法也就没有所谓的不同实例的概念了,

         它是独一份的,所以无论从哪个入口过来的对这个方法的访问一定受到锁的限制

 

三、结论

         3.1:synchronized出现的位置不同,锁住的粒度大小也就不同

         3.2:没有static的时候,被synchronized修饰的方法,锁仅对类的当前实例生效;

                 反之,相当于是对整个类加锁,任何实例都会受到锁的制约

         3.3:局部锁对整体影响最小