wait方法施放锁,notify方法持有锁
来源:互联网 发布:莱特币闪电网络 编辑:程序博客网 时间:2024/05/18 02:08
先来看下例子,这个例子中明显能看出问题代码如下:
package com.testredis;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.concurrent.ExecutorService;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.atomic.AtomicInteger;public class TestBlockingQueue { private AtomicInteger counter = new AtomicInteger(); private int minSize = 1; private int maxSize = 20; private List<Object> mq = new ArrayList(); private final Object lock = new Object(); public TestBlockingQueue(int minSize,int maxSize){ this.minSize = minSize; this.maxSize = maxSize; } public void put(Object object){ synchronized (lock){ //if (this.counter.get() >= maxSize){ 错误代码 while (counter.get() == maxSize){ try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } mq.add(object); counter.getAndIncrement(); System.out.println("put:"+object+" size:"+counter.get()); lock.notify(); } } public Object offer(){ synchronized (lock){ //if (this.counter.get() <= minSize){ 错误代码 while (counter.get() == minSize){ try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } Object object = mq.remove(0); counter.getAndDecrement(); System.out.println("offer:" + object + " size:" + counter.get()+" "+Thread.currentThread().getName()); lock.notify(); return object; } }}
上面是 模拟的阻塞队列
package com.testredis;import java.util.Random;/** * Created by Administrator on 2017/3/2. */public class PutThread implements Runnable{ private TestBlockingQueue mq = null; private MyQueue myQueue = null; public PutThread(TestBlockingQueue mq){ this.mq = mq; } public PutThread(MyQueue myQueue){ this.myQueue = myQueue; } @Override public void run() { Random r = new Random(1000); r.nextInt(); mq.put(r.nextInt()+""); //myQueue.put(r.nextInt()+""); }}
这个是 存储线程
package com.testredis;/** * Created by Administrator on 2017/3/2. */public class GetThread implements Runnable { private TestBlockingQueue mq ; private MyQueue myQueue; public GetThread(TestBlockingQueue mq){ this.mq = mq; } public GetThread(MyQueue myQueue){ this.myQueue = myQueue; } @Override public void run() { mq.offer(); //myQueue.take(); }}
这个是 获取线程
package com.testredis.single;import com.testredis.GetThread;import com.testredis.MyQueue;import com.testredis.PutThread;import com.testredis.TestBlockingQueue;import java.util.concurrent.ArrayBlockingQueue;import java.util.concurrent.ExecutorService;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;import java.util.concurrent.atomic.AtomicInteger;/** * Created by Administrator on 2017/3/2. */public class Main { Object lock = new Object(); AtomicInteger count = new AtomicInteger(1); public static void main(String[] args) { ArrayBlockingQueue getArrayQueue = new ArrayBlockingQueue(100); ArrayBlockingQueue putArrayQueue = new ArrayBlockingQueue(100); ExecutorService getPool = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, getArrayQueue); ExecutorService putPool = new ThreadPoolExecutor(5, 10, 60, TimeUnit.SECONDS, putArrayQueue); TestBlockingQueue mq = new TestBlockingQueue(2, 5); //MyQueue mq = new MyQueue(2,5); for (int i = 0; i < 100; i++) { PutThread put = new PutThread(mq); putPool.execute(put); } for (int i = 0; i < 100; i++) { GetThread get = new GetThread(mq); getPool.execute(get); } putPool.shutdown(); getPool.shutdown(); }}
定义了两个线程池进行测试 。
如果采用标记错误代码的方式(if)去实现的时候,线程进行判断然后 调用wait方法(释放锁并且线程会在进行等待,注意:这里已经跨过判断,如果线程唤醒将直接进行下面的操作 )。这个问题 就很明白说明wait方法是施放锁的。
0 0
- wait方法施放锁,notify方法持有锁
- 线程锁 多线程安全 wait、notify方法
- wait与notify方法
- wait/notify,sleep方法
- wait和notify方法
- Java中wait,notify方法
- java 线程 wait() notify() 方法
- java对象方法wait,notify
- 线程wait( )、sleep( )、notify( )方法
- 线程wait( )、sleep( )、notify( )方法
- [android]同步块代码中wait和sleep方法持有锁状态的区别
- (wait()或者notify()必须采用当前锁调用 ) && (类.方法VS对象.方法)
- wait(),notify()和锁
- wait,notify,synchronized锁
- wait notify 锁机制
- 多线程编程 -wait(),notify()/notityAll()方法
- 多线程编程 -wait(),notify()/notityAll()方法
- synchronized方法和wait、notify的关联
- thinkphp连接PostgreSQL数据库的BUG
- mybatis 官方文档记录总结
- oracle-DDL操作
- finished with non-zero exit value *问题解决
- objc_msgForward_demo
- wait方法施放锁,notify方法持有锁
- 计算页码总数(分页)
- 线程,进程,程序的区别
- 设计模式总结
- golang生成唯一标识id
- 解决IE浏览器的only one scriptx object can be used per browser window问题
- Java不用中间量 交换A、B
- Python小白第一个小程序出现的问题
- php拾漏