jdk1.5多线程Lock接口及Condition接口
jdk1.5多线程的实现的方式:
jdk1.5之前对锁的操作是隐式的
synchronized(对象) //获取锁
{
} //释放锁
jdk1.5锁的操作是显示的:在包java.util.concurrent.locks中含有多线程实现方式相关的接口和类。
有一个描述锁的Lock接口,也就是把锁面向对象了
使用Lock接口的子类ReentrantLock创建一把锁
Lock lock = new ReentrantLock();
使用Lock替代同步代码块的方式:
1:创建一把锁
2:把之前写在同步代码块中的代码写在lock()和unlock()之间
用lock替代同步代码块之后出现了IllegalMonitorStateException(无效的监视器状态异常)
因为wait(),notifyAll()必须用在同步中,而同步被Lock替代了,所以出现异常
jdk1.5对唤醒等待方法也进行了单独的描述,描述的接口是Condition。
唤醒等待方法必须结合锁来使用,所以使用Lock的newCondition()方法来获取和锁绑定的Condition对象。
下面使用jdk1.5多线程的实现方式,解决一次唤醒所有线程性能低的问题。

1 import java.util.concurrent.locks.*; 2 class Product 3 { 4 private String name; 5 private int count; 6 private boolean flag; 7 8 //创建一把锁 9 private Lock lock = new ReentrantLock(); 10 11 //得到和锁绑定的Condition对象,控制生产线程的唤醒和等待 12 private Condition pro = lock.newCondition(); 13 //得到和锁绑定的Condition对象,控制消费线程的唤醒和等待 14 private Condition con = lock.newCondition(); 15 16 //生产产品的功能 17 public void produce(String name) 18 { 19 lock.lock(); //获取锁 20 try 21 { 22 while (flag) 23 { 24 try{pro.await();}catch (InterruptedException e){e.printStackTrace();} 25 } 26 this.name = name+"..."+count; 27 System.out.println(Thread.currentThread().getName()+"***生产了***"+this.name); 28 count++; 29 flag = true; 30 con.signal(); 31 } 32 finally //为了保证锁必须被释放掉,使用try{...}finally{...} 33 { 34 lock.unlock(); //释放锁 35 } 36 } 37 38 //消费产品的功能 39 public void consume() 40 { 41 lock.lock(); 42 try 43 { 44 while (!flag) 45 { 46 try{con.await();}catch (InterruptedException e){e.printStackTrace();} 47 } 48 System.out.println(Thread.currentThread().getName()+"---消费了---"+this.name); 49 flag = false; 50 pro.signal(); 51 } 52 finally 53 { 54 lock.unlock(); 55 } 56 } 57 } 58 59 //生产任务 60 class Producer implements Runnable 61 { 62 private Product pro; 63 public Producer(Product pro) 64 { 65 this.pro = pro; 66 } 67 public void run() 68 { 69 while(true) 70 { 71 pro.produce("笔记本电脑"); 72 } 73 } 74 } 75 76 //消费任务 77 class Consumer implements Runnable 78 { 79 private Product pro; 80 public Consumer(Product pro) 81 { 82 this.pro = pro; 83 } 84 public void run() 85 { 86 while(true) 87 { 88 pro.consume(); 89 } 90 } 91 } 92 93 class Demo 94 { 95 public static void main(String[] args) 96 { 97 Product pro = new Product(); 98 99 Producer producer = new Producer(pro); 100 Consumer consumer = new Consumer(pro); 101 102 new Thread(producer,"生产线01").start(); 103 new Thread(consumer,"消费者01").start(); 104 new Thread(producer,"生产线02").start(); 105 new Thread(consumer,"消费者02").start(); 106 } 107 }

浙公网安备 33010602011771号