同步锁 syncharonized 和 Lock——学习笔记

同步锁

synchronized

可以锁对象,锁住的一定是公用的对象,可共用的资源,this指代当前对象可以锁。锁同一个对象时,该对象就会被加上同步锁,被加上同步锁的对象,在synchronized代码块没有执行结束之前,其他的线程,哪怕自己的类创建的其他线程,都不能再对加了锁的代码块有任何的访问。

可以锁类型 锁类型 , 范围大 ,不特指哪一个,
其实锁的就是类加载器,锁类型的过程就是只要你的代码块里出现了属于这个类型的对象,而另一个线程也锁住的是类型,这个时候你的代码块就会被锁住,只有你执行完了以后其他的代码块才会继续执行。

弊端:锁住的是整个对象,里面的所有方法都会默认添加上synchronized,所有的属性也会被锁住,所有的动作都不能正常执行。

可以锁方法,一运行到方法就获得锁,有线程去调用同步方法后,这个对象里面所有的同步方法全部锁定;

当一个方法加上了synchronized,就变成了同步方法,对于同步方法来说,任何一个线程在调用这个对象的同步方法后,这个对象里面的所有的其他同步方法就不能被其他线程所调用,但是这个对象里异步方法可以被其他线程调用的。

同步方法遇到的问题,当调用一个同步锁的方法时,会将这个对象其他加同步锁的方法给锁上了,
即加上同步锁,所有的加锁块全部锁上了,释放锁,所有的加锁块都释放了。

归根结底这个锁被加在对象上

Lock(concurrent 包下的接口)

ReentrantLock ——Lock的实现类

ReentrantLock 可重入锁

可多次获得锁,添了多少锁就得解多少,

lock()  加上锁
unlock() 释放锁

tryLock与lock没有区别,tryLock返回值为boolean。不能像lock直接lock.lock,而是if(lock.tryLock) {},因为tryLock不会后面内容加锁

读写锁 ReentrantReadWriteLock

如果先获得读锁,别人可以读不能写,别的所有的readLock都和你可以并发,writeLock和你同步
如果先获得写锁,别人不能读不能写,别的所有的读锁写锁都和你是同步

lock.readLock().lock;
lock.readLock().unlock;
、
lock.writeLock().lock; 上锁
lock.writeLock().unlock;   解锁
synchronized 和 Lock区别
synchronizedLock
存在层次java的关键字,在jvm层面
锁得释放以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁在finally中必须释放锁,不然容易造成线程死锁
锁的获取假设A线程获得锁,B线程等待。如果A线程阻塞,B线程 会一直等待大致就是可以尝试获得锁线程可以不用一直等待
锁状态无法判断可以判断
锁类型可重入 不可中断 非公平可重入 可中断 可公平
性能少量同步大量同步
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值