多线程 —— 使用代码显式加锁
2016-07-24 10:28
190 查看
以前我们都是使用 synchronized 关键字来保证同步的。现在我们使用同步锁,使得同步的概念体现得更加清晰。
例:卖票程序
测试方法:
例:卖票程序
/** * Created by liwei on 16/7/18. * * 在这个线程的例子里,因为添加了同步锁, * 才得以保证买票的事情在三个线程里有序执行者。 * 这一点希望用心体会。 * * */ public class SellTicket implements Runnable { // 定义票数 private Integer tickets = 100; // 定义锁对象 private Lock lock = new ReentrantLock(); @Override public void run() { while (true){ try{ // 加锁 lock.lock(); if(tickets>0){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出第" + (tickets--) + "张票。"); } }finally { // 释放锁 lock.unlock(); } } } }
测试方法:
/** * Created by liwei on 16/7/18. * * 测试方法:加上线程锁和不加线程锁的区别。 * */ /* * 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁, * 为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock。 * * Lock: * void lock(): 获取锁。 * void unlock():释放锁。 * ReentrantLock是Lock的实现类. */ public class SellTicketDemo { public static void main(String[] args) { // 创建资源对象 SellTicket st = new SellTicket(); // 创建三个窗口 Thread t1 = new Thread(st,"win1"); Thread t2 = new Thread(st,"win2"); Thread t3 = new Thread(st,"win3"); // 启动线程 t1.start(); t2.start(); t3.start(); } }
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- C#实现多线程的同步方法实例分析
- 浅谈chuck-lua中的多线程
- C#简单多线程同步和优先权用法实例
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析
- C#多线程之Thread中Thread.IsAlive属性用法分析
- 分享我在工作中遇到的多线程下导致RCW无法释放的问题
- C#多线程编程之使用ReaderWriterLock类实现多用户读与单用户写同步的方法
- C#多线程传递参数及任务用法示例
- C#控制台下测试多线程的方法
- 21天学习android开发教程之SurfaceView与多线程的混搭
- Ruby 多线程的潜力和弱点分析
- C#中WPF使用多线程调用窗体组件的方法
- C#如何对多线程、多任务管理(demo)