【Java八股锁机制的认识】synchronized和reentrantlock区分,锁升级机制
synchronized和reentrantlock及其应用场景synchronized 是什么synchronized 是 Java 提供的 内置锁机制。核心一句话保证同一时间只有一个线程执行某段代码。例如同时调用三个线程线程A线程B线程C有synchronized的存在使得三个线程可以A执行完B再执行C最后执行避免了线程安全问题A B C 同时执行synchronized 的本质synchronized 是锁更是对象监视器锁Monitor Lock用synchronized锁住了obj类当有线程进入到obj类中就会获取到obj的锁。如果别人已经拿走了锁就必须进行等待。synchronized 的三种用法锁普通方法publicsynchronizedvoidmethod(){}锁的是this对象锁代码块synchronized(obj){}锁的是obj对象3. 锁静态方法publicstaticsynchronizedvoidmethod(){}锁的是Class对象ReentrantLock 是什么ReentrantLock 是Java并发包提供的一种锁。相比synchronized更高级使用方法LocklocknewReentrantLock();lock.lock();try{// 临界区}finally{lock.unlock();}流程加锁执行释放锁为什么叫 Reentrant可重入可重入表示同一个线程可以多次获得同一把锁。举个例子methodA()↓methodB()两个方法都加锁lock同一个线程进入 methodA 后还能进入 methodB不会死锁。注意synchronized 也是可重入锁所以两者都是可重入锁ReentrantLock 比 synchronized好在哪1 可以手动控制锁synchronized自动加锁 自动释放ReentrantLock手动 lock() 手动 unlock()2 可以尝试获取锁lock.tryLock()说明如果拿不到锁就直接返回。而synchronized只能等待。3 可以设置公平锁newReentrantLock(true)公平锁先来先得synchronized不支持公平锁4 可以中断等待线程lock.lockInterruptibly()线程可以被中断synchronized 不支持。真实应用场景简单同步用synchronized比如计数器 简单资源保护publicsynchronizedvoidadd(){count;}复杂锁控制用ReentrantLock比如需要尝试获取锁需要超时需要公平锁if(lock.tryLock()){// 执行}高并发组件用ReentrantLock比如线程池并发容器阻塞队列总结表特性synchronizedReentrantLock类型JVM关键字Java类加锁方式自动手动释放锁自动必须unlock可重入支持支持公平锁不支持支持tryLock不支持支持中断锁不支持支持复杂控制弱强syncronized锁升级的过程先理解为什么需要锁升级因为在早期JDK版本syncronized性能很差因为他使用的是操作系统级别的互斥锁Mutex一旦线程竞争锁就会发生线程阻塞线程唤醒所以在JDK1.6版本之后出现了优化锁会根据竞争情况逐渐升级。这就是锁升级的由来。锁升级的整体过程升级过程无锁↓偏向锁↓轻量级锁↓重量级锁一句话理解竞争越激烈锁越重。第一阶段无锁状态第二阶段偏向锁当第一个线程访问到synchronized(obj){}JVM会认为只有一个线程会访问于是进入偏向锁偏向锁的含义锁偏向某个线程对象头会记录线程ID之后如果线程A再进入不需要加锁不需要CAS直接执行性能接近于无锁第三阶段轻量级锁此时如果另一个线程来了线程B线程B尝试获取锁此时JVM发现锁已经偏向线程A于是偏向锁失效升级为轻量级锁轻量级锁的核心思想是自旋线程不会立即阻塞而是循环尝试获取锁例如while(锁没释放){再试一次}这样可以避免线程阻塞线程唤醒性能比重量级锁好很多。第四阶段重量级锁如果线程越来越多线程A线程B线程C线程D此时自旋会消耗大量CPU。JVM就会判断竞争过于激烈将锁升级成重量级锁特点线程会被阻塞进入操作系统的Mutex锁流程变为线程A执行线程B阻塞线程C阻塞等线程A释放锁后操作系统唤醒其他线程锁升级流程图线程访问同步代码│▼无锁│▼偏向锁(单线程访问)│▼轻量级锁(少量竞争)│▼重量级锁(激烈竞争)存在的意义总结锁升级就是为了减少线程阻塞带来的性能开销。发明的产物
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412495.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!