觉得说的啰嗦的,可以直接看“三、结论”那段
一、static关键字的理解
被static修饰的变量或者方法,可以被当前工程的任意类在任意地方使用。
这是因为,它们被放入到了JVM堆中的永久代里面
因此,带static关键字的内容不会被回收,不会被重复分配内存,直至服务下次被重启。。。
二、静态与非静态锁的区别
这里说的锁,只是狭隘的指代“synchronized”关键字。
众所周知的是,被这个关键字修饰的非静态方法,我称其为方法锁;加在方法内某段代码中的,我称其为局部锁。
局部锁与方发锁的区别,就是锁的粒度的大小。粒度越小,影响范围越小,对业务整体的干扰也就越小。
如果我们只对某个类的一个方法加锁,那么这个类中的其他方法是不受到锁的制约的
这个类的其他方法仍然保证了并发性能
synchronized加锁的核心,是对某个类的当前实例进行加锁,防止其他线程对同一实例的当前方法的访问。
但是,如果是其他线程对这个类的不同实例的访问,就不受锁的限制和影响了。
但是,当我们在方法上引入了static这个家伙的时候,一切就变得不同了。
因为上面我们说过了,被static修饰的对象,其实是生存于永久代中,那么,当我们对这种方法加锁的时候
就相当于锁住了类本身。因此对于这个被synchronized修饰的方法也就没有所谓的不同实例的概念了,
它是独一份的,所以无论从哪个入口过来的对这个方法的访问一定受到锁的限制
三、结论
3.1:synchronized出现的位置不同,锁住的粒度大小也就不同
3.2:没有static的时候,被synchronized修饰的方法,锁仅对类的当前实例生效;
反之,相当于是对整个类加锁,任何实例都会受到锁的制约
3.3:局部锁对整体影响最小