同步锁
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区别
synchronized | Lock | |
---|---|---|
存在层次 | java的关键字,在jvm层面 | 类 |
锁得释放 | 以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放锁 | 在finally中必须释放锁,不然容易造成线程死锁 |
锁的获取 | 假设A线程获得锁,B线程等待。如果A线程阻塞,B线程 会一直等待 | 大致就是可以尝试获得锁线程可以不用一直等待 |
锁状态 | 无法判断 | 可以判断 |
锁类型 | 可重入 不可中断 非公平 | 可重入 可中断 可公平 |
性能 | 少量同步 | 大量同步 |