大神java中的一个关于java多线程的锁锁的问题

写一个多线程死锁案例,如何避免及解决死锁问题?_济南达内Java培训
写一个多线程死锁案例,如何避免及解决死锁问题?
时间: 09:52
发布:互联网
来源:互联网
&&& 写一个多线程死锁案例,如何避免及解决死锁问题?多线程死锁在java程序员笔试的时候时有遇见,大家应该也都明白它的概念,想学java找培训机构到:140多家中心 遍布全国40多个城市.
&&& 下面是一个多线程死锁的例子
&&& thread1 get lock1
&&& thread2 get lock2
&&& 两个线程相互得到锁1,锁2,然后线程1等待线程2释放锁2,线程2等待线程1释放锁1,两者各不相互,这样形成死锁.
&&& 那么如何避免和解决死锁问题呢?济南java培训机构:采用全球领先的O2O互联网+教学,双师授课确保教学质量全国统一,20大高端课程体系/技术课程,帮助学员解决就业问题.
&&& 1、按顺序加锁
&&& 上个例子线程间加锁的顺序各不一致,导致死锁,如果每个线程都按同一个的加锁顺序这样就不会出现死锁.
&&& 2、获取锁时限
&&& 每个获取锁的时候加上个时限,如果超过某个时间就放弃获取锁之类的.
&&& 3、死锁检测
&&& 按线程间获取锁的关系检测线程间是否发生死锁,如果发生死锁就执行一定的策略,如终断线程或回滚操作等.
&&& 更多济南java培训机构相关咨询扫一扫下方二维码
马上预约七天免费体验课
怕钱不够?就业挣钱后再付学费; &&&&怕学不会?0基础入学,达内定制课程;&&&&担心就业?
近12万家雇主企业,推荐名企就业
济南java培训机构的老师说,首先声明文章目的不是为了讨论java、c++的优劣,因为讨论这些意义不大
一:熟练掌握java以及相关技能-济南java培训机构负责整理
济南java培训机构的老师说,在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程
济南java培训机构的老师说,此篇文章的出发点是从先就业后择业的角度去分析java程序员的条提升,进阶之路.
Copyright (C)
Tedu.cn All Rights Reserved 京ICP备号-56 版权所有
选择城市和中心
达内北京亦庄大学生实训基地
达内北京网络营销中心
达内北京会计中心java面试题,写一个多线程死锁案例,如何避免及解决死锁问题?java面试题,写一个多线程死锁案例,如何避免及解决死锁问题?亲职教育百家号多线程死锁在java程序员笔试的时候时有遇见,死锁概念在之前的文章有介绍,大家应该也都明白它的概念,不清楚的去翻看历史文章吧。下面是一个多线程死锁的例子输出thread1 get lock1thread2 get lock2两个线程相互得到锁1,锁2,然后线程1等待线程2释放锁2,线程2等待线程1释放锁1,两者各不相互,这样形成死锁。那么如何避免和解决死锁问题呢?1、按顺序加锁上个例子线程间加锁的顺序各不一致,导致死锁,如果每个线程都按同一个的加锁顺序这样就不会出现死锁。2、获取锁时限每个获取锁的时候加上个时限,如果超过某个时间就放弃获取锁之类的。3、死锁检测按线程间获取锁的关系检测线程间是否发生死锁,如果发生死锁就执行一定的策略,如终断线程或回滚操作等。代码及所有资源请加java群下载,我们一起学习交流。架构之路,头条精选,每天一篇干货,喜欢就收藏+关注吧!本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观点,不代表百度立场。未经作者许可,不得转载。亲职教育百家号最近更新:简介:必达·更好的学校建设作者最新文章相关文章在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
public class Demo10_5 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义三个售票窗口
TicketWindow tw=new TicketWindow();
//使用三个线程同时启动
Thread t1=new Thread(tw);
Thread t2=new Thread(tw);
Thread t3=new Thread(tw);
t1.start();
t2.start();
t3.start();
class TicketWindow implements Runnable{
//一共两千张票
int nums=2000;
private Dog myDog=new Dog();
public void run() {
// TODO Auto-generated method stub
while(true){
//认为if else 要保证其原子性
synchronized (myDog)
//判断是否还有票
if(nums&0){
//显示售票信息
//Thread.currentThread().getName()当前线程的名字
System.out.println(Thread.currentThread().getName()+"正在售出第"+nums+"票");
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
//售票结束
class Dog{
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
非常抱歉,没能及时更新这个问题的答案。
后面我自己解决了这个问题。
我干了这么一件事情。
我初始化了一个窗口,安排了2000张卖票,然后安排三个工作人员卖票(三个线程)一起卖票(同时访问我设置的2000张票)。
其实这个我想问的是,为什么不能按照t1线程先卖,t2线程后卖,t3再买。
后面我想了,应该是操作系统的问题,线程的优先级不同。应该是不能按照顺序去卖这个票。
就和我们去买票的时候是一样的,随机的三个卖票的,是随机的,而不能按照顺序。
如果非要按照顺序的话,那么用一个线程就够了,何必要用多线程。
结论就是,完全锁住了,没有出现三个线程同时卖一张票的情况。
结果截图:
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
先说为什么三个线程没同步:
因为,没有什么需要同步的。
我猜测你的目的是三个线程同步售出2000张票。
程序中票数是TicketWindow的一个成员变量,而三的线程中各有一个TicketWindow实例。所以三个2000是互不相干的。
最简单的方式是把票数改为static,这样所有TicketWindow实例到使用同一个类成员变量。当然用来锁的dog也需要改为static。
后面是建议:
不要使用new thread方式写多线程,请参考Java concurrent包中Callable等类,在较高抽象级别处理多线程。
最后的建议:
练手写写无所谓,如果是真正要用的代码,不要写多线程同步逻辑!
找可靠的第三方库或者软件来处理。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你这么写没问题啊...
三个线程是在卖2000张票.. 而且是一张一张卖的, 也没重复卖..
不知道你是要问什么问题...
执行的时候, 三个线程不会是顺序来卖票的, 因为cpu的时钟选择哪个是不确定的... 如果你想要顺序卖的话, 逻辑就得都改一下了...
其他的答案... 你们确定看清楚别人是怎么写的了么... 锁是对的, 2000张票也是对的...
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。扫一扫体验手机阅读
java线程锁
<span type="1" blog_id="2084561" userid='
1篇文章,453人气,0粉丝
大数据时代的微服务之路
¥51.00419人订阅
<span type="1" blog_id="2084561" userid='Java多线程锁的知识实例讲解
Lock提供了与synchronized类似的同步功能,只是在显式的获取和释放锁,因此有了锁获取和释放的可操作性、可中断的获取锁以及超时获取锁等多种同步特性。
代码实例:
Lock lock = new ReentrantLock();
lock.lock();
lock.unlock();
尝试非阻塞地获取锁:当前线程尝试获取锁,如果这一时刻锁没有被其它线程获取到,则成功获取并持有锁; 能被中断地获取锁:获取到的锁的线程能够响应中断,当获取到锁的线程被中断时,中断异常将会抛出,同时锁被释放; 超时获取锁:在指定时间后获取锁,如果时间到了无法获取,则返回
队列同步器
队列同步器是用来构建锁或其它同步的基础框架
它使用一个int变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作
重写同步器指定方法是,需要使用以下3个方法访问或修改同步状态
getState():获取当前同步状态 setState(int newState):设置当前同步状态 compareAndSetState(int expect, int update):使用CAS设置当前状态,保证状态设置原子性
ReentrantLock:支持重进入的锁,可以支持一个线程对资源的重复加锁,同时还支持获取锁时的公平和非公平性选择。
重进入指任意线程在获取锁之后能够再次获取该锁而不会被锁所阻塞,主要解决以下两个问题:
线程再次获取锁:如果获取锁的线程为当前占据锁的线程,则再次获取成功; 锁的最终释放:在第n次释放该锁后,其他线程能够获取该锁;
公平是通过判断同步队列中是否有前驱节点来判断线程请求锁的早晚,从而让最早请求锁的线程获取锁。
公平性锁保证了FIFO原则,但是代价是造成了大量的线程切换。非公平性锁可能造成一个线程频繁可以获取锁,使其它线程&饥饿&,但是这样会减少线程切换,保证了吞吐量。
读写锁维护了一对锁,一个读锁,一个写锁。当写锁被获取到时,后续的读写操作都会被阻塞,写锁释放后,所有操作继续执行。
公平性选择:支持非公平和公平的锁获取方式; 重进入:支持重进入,读线程可以再次获取锁,写线程可以再次获取写锁,同时可以获取读锁; 锁降级:遵循获取写锁、获取读锁、释放写锁的次序
static Mapmap = new HashMap();
static ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
static Lock r = rwl.readLock();
static Lock w = rwl.writeLock();
public static final Object get(String key){
return map.get(key);
r.unlock();
public static final Object put(String key, Object value){
return map.put(key,value);
public static final void clear(){
map.clear();
w.unlock();
Condition接口
Condition接口提供了类似Object的监视器方法
Condition对象由Lock对象创建
Condition定义了等待/通知两种类型的方法,当前线程调用这些方法时,需要提前获取到Condition对象关联的锁
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
//当前线程进入等待状态直到被通知或中断
public void conditionWait() throws InterruptedException{
lock.lock();
condition.await();
lock.unlock();
//唤醒一个等待在Condition上的线程
public void conditionSignal() throws InterruptedException{
lock.lock();
condition.signal();
lock.unlock();
有界队列实例
public class BoundedQueue{
private Object[]
//添加下标、删除下标、数组当前数量
private int addIndex, removeIndex,
private Lock lock = new ReentrantLock();
private Condition notEmpty = lock.newCondition();
private Condition notFull = lock.newCondition();
public BoundedQueue(int size){
items = new Object[size];
//添加元素,如果数组满,则该线程进入等待状态,直到有空位
public void add(T t) throws InterruptedException{
lock.lock();
while(count == items.length){
notFull.await();
items[addIndex] =
if(++addIndex == items.length){
addIndex = 0;
notEmpty.signal();
lock.unlock();
//删除元素,如果数组空,则该线程进入等待状态,直到有新添加元素
@SuppressWarnings(&unchecked&)
public T remove() throws InterruptedException{
lock.lock();
while(count == 0){
notEmpty.await();
Object x = items[removeIndex];
if(++removeIndex == items.length){
removeIndex = 0;
notFull.signal();
return (T)x;
lock.unlock();
Lock和synchronized比较而言,Lock能完成synchronized所实现的所有功能;
但是Lock有比synchronized更精确的线程语义和更好的性能;
synchronized会自动释放锁,而Lock一定要求程序员手工释放,并且必须在finally从句中释放。}

我要回帖

更多关于 java 多线程排他锁 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信