一、Synchronized关键字:它是一个关键字,从JVM层面实现的同步,可以用来修饰静态方法、普通方法,或者方法中的代码块。
1、修饰静态方法和普通方法时,使用的锁分别是对应的类和当前对象。
2、修饰代码块时,可以指定使用哪个类锁和对象锁。
public class SynchronizeTest { static int sharedInt = 0; int objInt = 0; static synchronized void test1(){ sharedInt ++; } static void test2(){ synchronized (SynchronizeTest.class){ sharedInt++; } } protected void test3(){ synchronized (this){ objInt++; } } protected synchronized void test4(){ objInt++; } public static void main(String args[]) throws InterruptedException { Thread t1 = new Thread( ()->{ for(int i=1;i<=10000;i++){ SynchronizeTest.test1(); } } ){ }; Thread t2 = new Thread( ()->{ for(int i=1;i<=10000;i++){ SynchronizeTest.test1(); } } ){ }; t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(SynchronizeTest.sharedInt); } }
3、锁升级
在jdk1.6之后,该关键字的性能进行了优化,引入了偏向锁、轻量级锁、重量级锁的概念。
a、所谓偏向锁,是指jvm默认某个共享变量不断被同一个线程获取,这种情况下,可以节省线程之间的切换损耗。使得性能得到提升。
b、但是并不能保证只有一个线程不断获取共享变量,这时,若有其他线程加入竞争,则会由偏向锁升级为轻量级锁。在轻量级锁的情况下,线程之间的竞争通常不会太激烈,一个线程等待锁的时间比较短,因此它会通过自旋,保持当前线程空操作来等待锁被释放,通过自旋操作,可以避免线程被阻塞挂起,因为后者会是在操作系统的内核态进行操作,损耗比较大。
c、当线程之间的竞争比较大之后,轻量级锁就会升级为重量级锁,这时,线程会被挂起。
4、synchronnized原理
二、Lock及ReetrantLock:它是一个接口,属于API级别的锁。
原文:https://www.cnblogs.com/shuhe-nd/p/12349046.html