Java 读书笔记 21.2 并发
来源:互联网 发布:淘宝开店怎么发布商品 编辑:程序博客网 时间:2024/06/06 10:05
并发
public abstract class IntGenerator { private volatile boolean canceled = false; public abstract int next(); // Allow this to be canceled: public void cancel() { canceled = true; } public boolean isCanceled() { return canceled; }}
public class EvenChecker implements Runnable { private IntGenerator generator; private final int id; public EvenChecker(IntGenerator g, int ident) { generator = g; id = ident; } public void run() { while(!generator.isCanceled()) { int val = generator.next(); //System.out.println(val); if(val % 2 != 0) { System.out.println(val + " not even!"); generator.cancel(); // Cancels all EvenCheckers } } } // Test any type of IntGenerator: public static void test(IntGenerator gp, int count) { System.out.println("Press Control-C to exit"); ExecutorService exec = Executors.newCachedThreadPool(); for(int i = 0; i < count; i++) exec.execute(new EvenChecker(gp, i)); exec.shutdown(); } // Default value for count: public static void test(IntGenerator gp) { test(gp, 10); }}
public class EvenGenerator extends IntGenerator { private int currentEvenValue = 0; public synchronized int next() { ++currentEvenValue; //简单地说synchronized关键字将next()锁了起来, //加两次的中间是不会被的线程抢走; Thread.yield(); ++currentEvenValue; return currentEvenValue; } public static void main(String[] args) { EvenChecker.test(new EvenGenerator()); }}
或者通过显式的lock关键字
public class MutexEvenGenerator extends IntGenerator { private int currentEvenValue = 0; private Lock lock = new ReentrantLock(); public int next() { lock.lock(); try { ++currentEvenValue; Thread.yield(); // Cause failure faster ++currentEvenValue; return currentEvenValue; } finally { lock.unlock(); } } public static void main(String[] args) { EvenChecker.test(new MutexEvenGenerator()); } }
你可能发现lock要写好多东西,这也是java的思想,宁愿写的多,也舒服,非常明显的锁和释放,而且更细
import java.util.concurrent.*; import java.util.concurrent.locks.*; public class AttemptLocking { private ReentrantLock lock = new ReentrantLock(); public void untimed() { boolean captured = lock.tryLock(); try { System.out.println("tryLock(): " + captured); } finally { if(captured) lock.unlock(); } } public void timed() { boolean captured = false; try { captured = lock.tryLock(2, TimeUnit.SECONDS); } catch(InterruptedException e) { throw new RuntimeException(e); } try { System.out.println("tryLock(2, TimeUnit.SECONDS): " + captured); } finally { if(captured) lock.unlock(); } } public static void main(String[] args) { final AttemptLocking al = new AttemptLocking(); al.untimed(); // True -- lock is available al.timed(); // True -- lock is available // Now create a separate task to grab the lock: new Thread() { { setDaemon(true); } public void run() { al.lock.lock(); System.out.println("acquired"); } }.start(); Thread.yield(); // Give the 2nd task a chance al.untimed(); // False -- lock grabbed by task al.timed(); // False -- lock grabbed by task }
当线程被锁起来,下面两个函数虽然拿不到锁,但是还可以做别的;
原子性
0 0
- Java 读书笔记 21.2 并发
- 《Java 并发实践》读书笔记
- java 并发编程读书笔记
- java并发-读书笔记
- 【Java并发编程】读书笔记
- Java 读书笔记 21.1并发
- Java 读书笔记 21.4 并发
- java并发实战读书笔记
- <读书笔记--并发>二、java并发机制
- JAVA并发编程实践--读书笔记
- 《Java并发编程实战》读书笔记
- Java并发编程实践 读书笔记
- Java并发编程实践读书笔记
- 《Java并发编程实战》读书笔记
- java并发编程实战-读书笔记
- Effective Java读书笔记(四):并发
- 《Java并发编程实战》读书笔记
- 《java并发编程实战》读书笔记
- 多线程学习(四)-线程范围内共享数据
- 聚类
- Android sensor架构(二)SystemSensorManager以及JNI、sensorService(and5.1)
- 6 areas of artificial intelligence to watch closely 需要密切关注的六大人工智能/机器学习领域
- c++实验2
- Java 读书笔记 21.2 并发
- 1.Matlab 画图输出 EPS 格式文件中文出现乱码
- css基础知识小结
- PM命令分析
- Java内存与垃圾回收调优
- iOS 组件化,插件化,模块化设计思路分析
- 天梯赛喊山
- 将项目部署至 Linux + tomcat 服务器中常用的指令
- C++Primer第五版 第十五章习题答案(41~42)