黑马程序员-java5的线程锁技术Lock,Condition
2014-04-07 14:20
543 查看
---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流!
----------------------
java.util.concurrent.locks.Lock
格式:Lock lock=new ReentrantLock();
读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥,这是由jvm自己控制的。
小结:读锁控制读线程与写线程的互斥,就是说多个线程可以同时读,但写线程就不能进来,如果不加读锁,写线程就会进来,这就是读锁的作用。
写锁:控制写线程与写线程的互斥。
格式:
小结:读锁中的lock方法
写锁中的lock方法
DataDemo类
ReadWriteLockTest类
输出结果:
注意我注释掉了读锁
所以出现这个结果很正常,因为读线程么有加读锁,如果加了的话,如果写线程没有释放锁,读线程rwl.readLock().lock();就会阻塞,如果不加读锁,读线程就不会阻塞。
自己写个缓存系统:
CacheDemo类
----------------------
<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
----------------------
java.util.concurrent.locks.Lock
格式:Lock lock=new ReentrantLock();
lock.lock(); try { } finally { lock.unlock(); }
读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥,这是由jvm自己控制的。
小结:读锁控制读线程与写线程的互斥,就是说多个线程可以同时读,但写线程就不能进来,如果不加读锁,写线程就会进来,这就是读锁的作用。
写锁:控制写线程与写线程的互斥。
格式:
ReadWriteLock rwl = new ReentrantReadWriteLock(); try { rwl.readLock().lock(); } finally { rwl.readLock().unlock(); } try { rwl.writeLock().lock(); } finally { rwl.writeLock().unlock(); }
小结:读锁中的lock方法
写锁中的lock方法
DataDemo类
public class DataDemo { private String data; public void put(String data) { System.out.println(Thread.currentThread().getName() + "be ready write"); try { Thread.sleep(200); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "have write data" + data); this.data = data; } public String get() { System.out.println(Thread.currentThread().getName() + "be ready read"); try { Thread.sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "have read data" + data); return data; } }
ReadWriteLockTest类
import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriteLockTest { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub final ReadWriteLock rwl = new ReentrantReadWriteLock(); final DataDemo dataDemo = new DataDemo(); for (int i = 0; i < 3; i++) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (true) { // rwl.readLock().lock(); dataDemo.get(); // rwl.readLock().unlock(); try { Thread.currentThread().sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } for (int j = 0; j < 3; j++) { new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub Random random = new Random(); while (true) { rwl.writeLock().lock(); String str = random.nextInt() + "abc"; dataDemo.put(str); rwl.writeLock().unlock(); try { Thread.currentThread().sleep(20); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }).start(); } } }
输出结果:
注意我注释掉了读锁
所以出现这个结果很正常,因为读线程么有加读锁,如果加了的话,如果写线程没有释放锁,读线程rwl.readLock().lock();就会阻塞,如果不加读锁,读线程就不会阻塞。
自己写个缓存系统:
CacheDemo类
import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class CacheDemo { static Map<String, Object> map = new HashMap<String, Object>(); static Object obj; static ReadWriteLock lock = new ReentrantReadWriteLock(); /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub } public static Object get(String str) { try { lock.readLock().lock(); if (map.get(str) == null) { try { lock.readLock().unlock(); lock.writeLock().lock(); if (map.get(str) == null) { obj = "";// 查询数据库 } } finally { lock.writeLock().unlock(); lock.readLock().lock(); } } } finally { lock.readLock().unlock(); } return obj; } }
----------------------
<a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
相关文章推荐
- (六) Java多线程详解之线程锁Lock和Condition线程通信技术
- 黑马程序员——Java5中的线程并发库(一)---概述、线程池、Callable和Future、Lock和Condition
- 【Java线程】锁机制:synchronized、Lock、Condition
- java并发包中的Condition和Lock 取代Synchronized、wait、notify/notifyAll实现线程的同步与互斥
- 【Java线程】锁机制:synchronized、Lock、Condition
- java线程协作,经典生产者/消费者模式(二、Lock和Condition)
- 黑马程序员:线程间通信介绍:wait()、notify()、Lock、Condition等介绍
- 【Java线程】锁机制:synchronized、Lock、Condition
- JAVA线程锁lock下Condition高级使用-多个Condition的整合使用
- Java 多线程(四)线程间的通信jdk1.5中Lock,Condition----各种锁的相关详细概念
- 【Java线程】锁机制:synchronized、Lock、Condition
- java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
- java线程 使用显示的lock 和condition
- 黑马程序员——Java基础---线程的另一个总结(7)--condition,await
- 黑马程序员—java技术blog—第十四篇线程基础概述
- 【Java线程】锁机制:synchronized、Lock、Condition
- 【Java线程】锁机制:synchronized、Lock、Condition
- java 多线程学习之多生产者多消费者产生的线程安全问题分析与解决:Lock和Condition
- 【Java线程】Lock、Condition
- Java 多线程(三)线程间的通信jdk1.5中Lock,Condition---生产者消费者为例