栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > Java面试题

Java使用互斥锁的注意事项

Java面试题 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java使用互斥锁的注意事项

举例:男孩和女孩例子,每个女孩是一个对象,每个男孩是个线程。每个女孩都有自己的锁池。每个男孩可能在锁池里等待。

Class Girl{

Public void hand(){

 

}

Public syncronized void kiss(){

 

}

}

Class Boy extends Thread{

Public void run(){

}

}

锁标记如果过多,就会出现线程等待其他线程释放锁标记,而又都不释放自己的锁标记供其他线程运行的状况。就是死锁。

死锁的两种处理方法

统一排列锁顺序(解决不同方法中对多个共享资源的访问)

对象1的方法

synchronized(a)

synchronized(b)

对象2的方法

synchronized(a)

synchronized(b)

2.线程间通信(也就是线程间的相互协调)

 

线程间通信使用的空间称之为对象的等待池(wait pool),该队列也是属于对象的空间的。

进入等待池

使用Object类中wait()的方法,在运行状态中,线程调用wait(),此时表示线程将释放自己所有的锁标记和CPU的占用,同时进入这个对象的等待池。等待池的状态也是阻塞状态,只不过线程释放自己的锁标记。

 

退出等待池进入锁池

notify():将从对象的等待池中移走一个任意的线程,并放到锁池中,那里的对象一直在等待,直到可以获得对象的锁标记。

notifyAll(): 将从等待池中移走所有等待那个对象的线程并放到锁池中,只有锁池中的线程能获取对象的锁标记,锁标记允许线程从上次因调用wait()而中断的地方开始继续运行

 

注意:只能对加锁的资源进行wait()和notify()。

1) wait():交出锁和CPU的占用;

2) notify():将从对象的等待池中移走一个任意的线程,并放到锁池中,那里的对象一直在等待,直到可以获得对象的锁标记。

3) notifyAll(): 将从等待池中移走所有等待那个对象的线程并放到锁池中,只有锁池中的线程能获取对象的锁标记,锁标记允许线程从上次因调用wait()而中断的地方开始继续运行

 

注:在java.io包中Vector 和 HashTable 之所以是线程安全的,是因为每个方法都有synchronized修饰。Static 方法可以加 synchronized , 锁的是类对象。

但是Vector 是 jdk 1.0 的  ArrayList 是 jdk1.2 所以实际应用还是使用ArrayList

例子:

生产者和消费者

一个柜台一定数量的产品,柜台满时不能生产,空时不能够买。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/359658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号