多线程(二十七)Synchronized关键字


prtyaa
prtyaa 2023-12-28 16:40:44 49092 赞同 0 反对 0
分类: 资源
独享锁(写):给资源加上写锁,线程可以修改资源,其他线程不能再加锁。(单写) 共享锁(读):给资源加上读锁后,只能读不能修改,其他线程也只能加读锁,不能加写锁(多读)

乐观锁:假定没有冲突,在修改数据时如果发现数据和之前获取的不一致,则读最新数据,修改后,重试修改。

悲观锁:假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁


可重入锁:线程拿到一把锁之后,可以自由进入同一把锁所同步的其他代码。

不可重入锁:那就是与可重入锁相反。线程拿到一把锁之后,不可以自由进入同一把锁所同步的其他代码。


公平锁:争抢锁的顺序,如果是按先来后到,则为公平

非公平锁:争抢锁的顺序,如果不是按先来后到,则为不公平

 

synchronized 的特性是:可重入锁,独享锁,悲观锁,排他锁,非公平锁。

锁消除:JIT编译器会把stringbuffer的append方法进行锁消除,因为append方法源码是加synchronized关键字的。那么不停的append会造成性能问题。所以JIT编译的时候会对这一部分单线程进行的时候进行锁消除。把synchronized语义消除掉。这就是锁消除

 

锁粗化:运行时 JIT 编译优化

public class Test1 {
    int count;
    public void print() {
        for (int i = 0; i < 1000000; i++) {
            synchronized (this){
                System.out.println(count++);
            }
        }
    }

    public static void main(String[] args) {
        Test1 t = new Test1();
        t.print();
    }
}

上面这段代码经过锁粗化后会变成这样:

public class Test1 {
    int count;

    public void print() {
        synchronized (this) {
            for (int i = 0; i < 1000000; i++) {
                System.out.println(count++);
            }
        }
    }

    public static void main(String[] args) {
        Test1 t = new Test1();
        t.print();
    }
}

sync是锁对象,那么对象头里保存了信息的。

未锁定的状态就是第一行 hashcode 01(Tag)

既然是未锁定,现在两个线程如果遇到sync关键字那就是要抢锁了,抢锁的话就是要改变Tag的值。

先看轻量级锁,现在线程要去抢轻量级锁,要改变Tag的值,怎么改变?用CAS操作

CAS的缺点:一次只能修改一个值,自旋消耗CPU资源,ABA问题。

自旋有一定的次数限制,超过次数限制后。就会升级锁,--> 重量级锁。

重量级锁

重量级锁会有 Monitor ,Java当中每一个对象都会有一个Monitor

当轻量级锁到重量级锁升级的过程中Tag状态位的修改 就不是CAS修改的了。是JVM实现的。

原来锁的信息是记录在Java对象的对象头中,而升级了重量级锁后,这个信息就记录在Monitor中了。

Monitor中有 owner字段,就是标记了谁获取了锁。引出Monitor是为了不让其他线程进行自旋抢锁了。那怎么抢锁呢?就会有一个EntryList,一个集合。里面存的是等待的线程。EntryList里面的线程就挂起,不再自旋抢锁。

对象调用wait()方法后,owner 就 == null 然后进入 WaitSet 集合。因为wait是释放锁的,所以释放了之后,EntryList中的线程就可以去抢锁

如果对象调用了 notify方法的话,那么WaitSet 中的线程会出来抢锁,或者进入EntryList。

如果代码sync代码执行完毕,那么对象就会释放锁也释放。那么和wait的区别就在于 wait之后是进入了WaitSet,而退出后,就正儿八经的退出了,不再持有Monitor了。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
统信桌面专业版【全盘安装UOS系统】介绍  28
银河麒麟桌面操作系统备份用户数据  22
银河麒麟桌面操作系统安装佳能打印机驱动方法  17
银河麒麟桌面操作系统 V10-SP1用户密码修改  16
最近下载排行榜
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统备份用户数据 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益217.55元

3

1843880570 收益214.2元

4

IT-feng 收益208.98元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!