黑马程序员——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) {

			}
		}
	}
}


黑马程序员——Java多线程线程间通信之Lock的应用

Lock锁的应用        Java的线程间通信就是多个线程在操作同一资源,但操作的动作不同。譬如有一个商店,我们可以去里面买东西,但同时商店也在不断的进货才能保证有东西来卖给我们,商店就相当于要...

黑马程序员——Java5中的线程并发库(一)---概述、线程池、Callable和Future、Lock和Condition

多线程与数据共享 一.ThreadLocal实现线程范围的共享变量 1.见下面的示意图和辅助代码解释ThreadLocal的作用和目的,用于实现线程内数据共享,即对于相同的程序代码,多个模块在同一...

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

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

黑马程序员 学习笔记——Java 二十三设计模式之单例

----------------------android培训 、java培训、期待与您交流! ---------------------- Java 中解决某一问题最行之有效的方法是设计模式。...

黑马程序员——Java面向对象之抽象类 接口 内部类笔记

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 三, 抽象类概述: 在Java中,一个没有方法体的方法应该定义为抽象方法, 而类中如果...

黑马程序员Java笔记——抽象类、接口、内部类(拾遗补录)

----------- android培训、java培训、java学习型技术博客、期待与您交流! --------- 拾遗补录: 面向对象与面向过程: (1)面向对象与面向过程的区别,以及有哪些编程...

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

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

【黑马程序员】 java笔记——基础加强

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- Java基础加强学习 1....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员——JAVA笔记——LOCK
举报原因:
原因补充:

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