Synchronized和Lock

一、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级别的锁。

 

posted @ 2020-02-23 11:58  sliec  阅读(126)  评论(0编辑  收藏  举报