黑马程序员——JAVA笔记——LOCK

原创 2015年07月08日 11:24:06

------- android培训java培训、期待与您交流! ----------


JDK1.5 中提供了多线程升级解决方案。

将同步Synchronized替换成显示Lock操作。

将Object中的wait,notify,notifyAll,替换成了Condition对象。

该对象可以通过Lock锁进行获取。


通过Lock lock=new ReentrantLock();获取锁对象。

用lock()和unlock()方法得到锁和释放锁。


lock和unlock中间就是同步区域,也就是说每次只能有一个线程进行操作。

class Outputter1 {    
    private Lock lock = new ReentrantLock();// 锁对象     
  
    public void output(String name) {           
        lock.lock();      // 得到锁     
  
        try {    
            for(int i = 0; i < name.length(); i++) {    
                System.out.print(name.charAt(i));    
            }    
        } finally {    
            lock.unlock();// 释放锁     
        }    
    }    
}

对于读写操作,lock中有一个ReadWriterLock用于处理读写操作的同步。

通过ReadWriteLock rw = new ReentrantReadWriteLock();获取读写锁。

通过rw.writeLock().lock();和rw.readLock().lock();得到锁。

再分别通过rw.writeLock().unlock();和w.readLock().unlock();释放锁。

以此来保证读写线程互不干扰。


Condition可以替代传统的线程间通信,用await()替换wait(),用signal()替换notify(),用signalAll()替换notifyAll()。

Condition是绑定在Lock上的所以要创建Condition对象要先创建Lock对象。

Condition cond=lock.newCondition();

Condition可以为多个线程间建立不同的Condition。


例:生产者消费者

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class Demo
{
	public static void main(String[] args)
	{
		Resource res=new Resource();
		Producer p=new Producer(res);
		Consumer c=new Consumer(res);
		Thread t1=new Thread(p);
		Thread t2=new Thread(p);
		Thread t3=new Thread(c);
		Thread t4=new Thread(c);
		t1.start();
		t2.start();
		t3.start();
		t4.start();
		
	}
}

class Resource
{
	private String name;
	private int count=1;
	private  boolean flag=false;
	private Lock lock=new ReentrantLock();
//	private Condition con=lock.newCondition();
	private Condition cond_pro=lock.newCondition();
	private Condition cond_con=lock.newCondition();
	
	public void set(String name)throws InterruptedException
	{
		lock.lock();
		try
		{
			while(flag)
				cond_pro.await();
			this.name=name+"---"+count++;
			System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
			flag=true;
			cond_con.signalAll();
		}
		finally
		{
			lock.unlock();
		}
	}
	
	public void out() throws InterruptedException
	{
		lock.lock();
		try{
			while(!flag)
				cond_con.await();
			System.out.println(Thread.currentThread().getName()+"消费者"+name);
			flag=false;
			cond_pro.signalAll();
		}
		finally
		{
			lock.unlock();
		}
	}
}

class Producer implements Runnable
{
	private Resource res;
	Producer(Resource res)
	{
		this.res=res;
	}
	
	public void run()
	{
		while(true)
		{
			try {
				res.set("+商品+");
			} catch (InterruptedException e) {

			}
		}
	}
}

class Consumer implements Runnable
{
	private Resource res;
	Consumer(Resource res)
	{
		this.res=res;
	}
	
	public void run()
	{
		while(true)
		{
			try {
				res.out();
			} catch (InterruptedException e) {

			}
		}
	}
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

黑马程序员——多线程(Lock、setDaemon、join、setPriority、yield)

黑马程序员——多线程(Lock、setDaemon、join、setPriority、yield

黑马程序员——java高新技术2学习笔记整理

------- android培训、java培训、期待与您交流! ---------- java高新技术2学习笔记整理 1:BeanUtils工具包:提供了一些静态方法,可以操作JavaBean的...

黑马程序员java学习笔记——GUI图形化界面

GUI图形用户界面     GUI概述     计算机有两种方式可以和用户进行交互,第一种是命令行方式,但是命令行方式使用起来比较麻烦,需要记录住很多命令,不方便操作,所以后来出现了另一种交互方式,...

黑马程序员——JAVA学习笔记(一)

------- android培训、java培训、期待与您交流! ----------

【黑马程序员】 java笔记——接口与内部类

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- 接口与内部类 一、接口 ...

黑马程序员Java笔记——多线程篇

----------- android培训、java培训、java学习型技术博客、期待与您交流! --------- 关键词: 多线程的秘密花园、 Thread先生与Runnable小姐、同步 引...

黑马程序员——Java基础笔记---数组

A、基本概念 定义:同一个类型数据的集合,其实数组就是一个容器。 数组的好处:可以自动给数组中的元素从0开始编号,方便操作这些元素。 格式1: 元素类型[ ] 数组名= new 元素类型[ 元素个数或...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)