java锁的概念

排它锁和共享锁:synchronized、ReentrantLock属于排它锁,ReentrantReadWriteLock写锁也是排它的,共享锁(ReentrantReadWriteLock的读锁)

可重入锁:比如一个对象中,有方法1和方法2被synchronized修饰,方法1内部可调用方法2,就叫作可重入。另外,ReentrantLock也可以。原理:比如ReentrantLock,其实因为加锁的是同一个对象,所以只需要把锁的计数器状态+1,退出一个锁就-1,直到所有锁都退出。像ConcurrentHashMap的Segment就继承了ReentrantLock。

ReentrantReadWriteLock等非重入锁,不能在获取读锁时再获取写,会死循环。但写锁中可以获取读锁。

 

公平和非公平:ReentrantLock实现这两种(new ReentrantLock(isFair);),默认是非公平锁。其中公平锁遵循FIFO先进先出,即按照线程启动的顺序执行。而非公平锁是抢占式的,大家都知道锁释放和唤醒其他线程从挂起回复到RUNNABLE状态,这需要一定时间,如果这个时候有其他线程直接就获取到锁并执行,就可以省去这段时间消耗,所以非公平更优化。但读写锁中,读并发高,是不是就很难获取到写锁,不是的,其实现是优先写机制(具体情况待续...)。

 

阻塞和非阻塞:即调用方法执行时,如果获取锁失败,继续等待直到加锁成功叫阻塞;若立即返回就叫非阻塞。

 

Condition:线程之间的通信,Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过该对象与任意 Lock 实现组合使用,为每个对象提供多个设置等待的地方(只需要调用该对象成员变量Condition的方法),Condition 替代了 Object 监视器方法的使用。

 

Unsafe类:提供了硬件级别的原子操作。

1)可以分配内存,可以释放内存

2)可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的;

3)将一个线程进行挂起或恢复。

4)CAS操作,是通过compareAndSwapXXX方法实现的,有3个操作数,内存值M,预期值E,新值U,如果M==E,则修改内存值

 

乐观、悲观锁:cas是乐观的,操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。

 

mysql中,也有共享锁和排它锁的概念,其中,update,delete和insert会自动对相应数据加上排它锁,普通select没有加任何锁,可通过select ... for update.来加排它锁,也可通过select ... lock in share mode加共享锁(多个线程都可以读,但只要有一个读锁,就不能进行写)。

 

 

锁的对比:

synchronized+ReentrantLock:由于synchronized是在JVM层面实现的,因此系统可以监控锁的释放与否,而ReentrantLock使用代码实现的,系统无法自动释放锁,需要在代码中finally子句中显式释放锁lock.unlock();

synchronized释放锁:1)线程获取锁的线程执行完了该代码块,然后线程释放对锁的占有;2)线程执行发生异常,此时JVM会让线程自动释放锁。另外因为是底层实现,线程获取锁阻塞,也会阻塞到其他要获取锁的线程。

ReentrantLock:由代码实现,初始化时new可选择公平或非公平锁,线程获取锁时可快速失败,但必须手动关闭锁。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值