-------
android培训、
java培训、期待与您交流! ----------
/**
* 读写锁
* 我们开启分别开启三个读的线程,分别开启三个写的线程
* 读的时候其它的线程可以读,但是其它的线程不可以写
* 写的时候其它的线程不可以写
*/
public class ReadWriteLockDemo {
public static void main(String[] args) {
final Queue3 q3=new Queue3();
for(int i=1;i<=3;i++){
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
q3.read(); //读数据
}
}).start();
new Thread(new Runnable(){
public void run(){
while(true){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
q3.put(new Random().nextInt(10000)); //放的是10000以内的随机数
}
}
}).start(); //不停的写数据
}
}
}
//读写锁示例代码
class Queue3{
Object obj=null; //所有的线程共享同一个对象。读的时候和写的时候都是使用的同一个对象
//我们不可以使用普通的锁。因为这样一旦锁定了。读和写都进不去了。我们应该使用它的子类来实现
private ReadWriteLock rw=new ReentrantReadWriteLock(); //这可是可重入的锁。它是显示的进行加锁和解锁
public void read(){
rw.readLock().lock(); //上读锁
try {
System.out.println(Thread.currentThread().getName()+"be ready to read data ");
Thread.sleep((long)Math.random()*1000);
System.out.println(Thread.currentThread().getName()+"have read data :"+obj);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
//把读锁给释放掉
rw.readLock().unlock();
}
//全部装在try里面是为了保证不管程序出现什么意外。锁一定会被释放掉
}
public void put(Object obj){
rw.writeLock().lock(); //上写锁
try {
System.out.println(Thread.currentThread().getName()+"be ready to write data ");
Thread.sleep((long)Math.random()*1000);
this.obj=obj; //给对象赋值
System.out.println(Thread.currentThread().getName()+"have write data :"+obj);
} catch (InterruptedException e) {
e.printStackTrace();
}finally{
rw.writeLock().unlock(); //把写锁给释放掉
}
}
}