java锁的使用 java怎么避免死锁?
java怎么避免死锁?
1、尽量在用tryLock(halftimeout,TimeUnit unit)的方法(ReentrantLock、ReentrantReadWriteLock),设置中连接失败时间,超时可以逃离如何防止死锁。
2、最好不要在用(jdk1.5以上)包的并发类不用打印压制并发,也很常用的是ConcurrentHashMap、ConcurrentLinkedQueue、AtomicBoolean等等,实际应用中中十分用处,简单点方便些且效率比在用Lock更高。
3、尽量减少锁的使用粒度,尽量不要几个功能用同一把锁。
4、最好不要下降不同步的的代码块。
百度搜索圈T社区付费行业视频教程
Java并发线程如何阻塞和唤醒?
每个对象都是两个方法wait和notify,加上同步
Java并发线程的阻塞和再唤醒可分几类:
基于条件JVM的对象头来实现方法,多线程争抢同一个临界资源时据完全不同的锁机制(自旋锁、轻/最重量级锁)来并且堵塞和沉睡。
,yeild等基础机制这里暂时不轻轻略过,大体实现方法原理是实现对象的网络同步队列和后面的AQS很像。
3.并发组件的基础AQS重点说下AQS(AbstractQueuedSynchronizer),
只不过这是jdk并工程分包实现方法的基础(如Lock、BlockingQueue、CountdownLatch等)。
Aqs基本上由一个volatile变量state和个再等待队列来实现方法,抢锁时先CAS直接修改state,失败的可能以后就弄到等待队列里,并通过LockSupport将线程挂起。
当锁的拥有者释放锁时会实际LockSupport再唤醒耐心的等待队列的情报营节点,让它再次去尝试抢锁(CAS如何修改state),如此反复。
手中掌握AQS的原理对再理解jdk里很多并发组件太有帮助。
()方法:以毫秒为单位,使线程进入阻塞状态,时间到了过后,自动启动再唤醒。
()和resume()方法:挂著和驱散线程,suspende()使线程直接进入堵塞状态,只有随机的resumee()被全局函数的时候,线程才会直接进入可先执行状态。这个不建议您可以使用,太容易不可能发生死锁情况。
3.yield()方法:动态创建yield()的效果等价于指挥和调度程序其实该线程已负责执行了足够的时间最大限度地转回另一个线程
这里就说这三种吧,其它的你可以不去csdn上门看看,去学习再看看
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。