标签:zed write java并发 直接 put getname 两种 问题 alt
https://www.cnblogs.com/helios-fz/p/11216925.html
Lock接口的最大优势是它为读和写提供两个单独的锁(ReentrantReadWriteLock),ReentrantReadWriteLock的特点是:“读读共享”,“读写互斥”,“写写互斥”。(附:Lock取款机示例)
高性能缓存简易示例:
public class ReadWriteMap { private final Map<Object, Object> map; private final ReadWriteLock lock = new ReentrantReadWriteLock(); private final Lock readLock = lock.readLock(); private final Lock writeLock = lock.writeLock(); public ReadWriteMap(Map<Object, Object> map) { this.map = map; } public Object put(Object key, Object value) { try { writeLock.lock(); return map.put(key, value); } finally { writeLock.unlock(); } } public Object get(Object key) { try { readLock.lock(); return map.get(key); } finally { writeLock.unlock(); } } }
sleep() 是Thread类的静态方法,调用此方法会让当前线程暂停执行指定的时间,将执行机会(CPU)让给其他线程,但是对象的锁(或监视器)依然保持。休眠时间结束后线程自动回到就绪状态。
wait() 是Object类的方法,调用此方法会让当前线程暂停执行指定的时间,并放弃对象锁进入等待池(wait pool)。只有调用对象的notify()或notifyAll()方法才能唤醒等待池中的线程进入等锁池(lockpool)。如果线程重新获得对象的锁就可以进入就绪状态。
wait()方法多用于线程间通信,而sleep()只是在执行时暂停。
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。
1)阻塞的插入:当队列满时,队列会阻塞插入元素的线程,直到队列不满。
2)阻塞的移除:当队列空时,队列会阻塞移除元素的线程,直到队列不空。
public class BlockingQueue { private final List<Object> queue = new LinkedList<>(); private int capacity = 10; public BlockingQueue() { } public BlockingQueue(int capacity) { this.capacity = capacity; } public synchronized Object put(Object item) throws InterruptedException { while (queue.size() >= capacity) { wait(); } queue.add(item); notifyAll(); return item; } public synchronized void remove() throws InterruptedException { while (0 == queue.size()) { wait(); } queue.remove(0); notifyAll(); } public synchronized int getSize() { return queue.size(); } }
附:我在实现阻塞队列时遇到的一个问题 https://www.cnblogs.com/helios-fz/p/11721583.html
https://www.cnblogs.com/helios-fz/p/11663518.html
https://www.cnblogs.com/helios-fz/p/10935129.html
调用start()方法时,它会新建一个线程然后执行run()方法中的代码。
直接调用run()方法,则不会创建新线程,方法中的代码会在当前调用者的线程中执行。验证如下:
public static void main(String[] args) throws InterruptedException { Thread thread1 = new Thread(() -> System.out.println(Thread.currentThread().getName())); Thread thread2 = new Thread(() -> System.out.println(Thread.currentThread().getName())); thread1.setName("thread1"); thread1.start(); Thread.sleep(1000); thread2.setName("thread2"); thread2.run(); }
线程调度是指按照特定机制为多个线程分配CPU的使用权。
一般的调度模型有两种:分时调度模型和抢占式调度模型。
Java使用的是抢占式调度。
标签:zed write java并发 直接 put getname 两种 问题 alt
原文地址:https://www.cnblogs.com/helios-fz/p/11700320.html