Java多线程——出售票(线程同步,数据共享)
2017-03-14 16:47
225 查看
例:有A B C三个窗口可以买票,三个窗口总共可以卖10张。
学习重点在于线程的数据共享,与同步。
要学习线程的同步就要来了解 synchronized 这个关键词:
转自http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
以上规则对其它对象锁同样适用.
学习重点在于线程的数据共享,与同步。
package com.txp; import java.util.Vector; class MyData { private int ticket = 10; public synchronized void sell() { ticket--; } public int num() { return ticket; } } class ThRun2 implements Runnable { MyData data = new MyData(); public void run() { while (data.num() > 0) { data.sell(); System.out.println(Thread.currentThread().getName() + "出售1张票"); } } } public class ThreadDemo06 { public static void main(String[] args) { ThRun2 r = new ThRun2(); Thread t1 = new Thread(r, "A窗口"); Thread t2 = new Thread(r, "B窗口"); Thread t3 = new Thread(r, "C窗口"); Vector<Thread> threads = new Vector<Thread>(); //将线程添加到 矢量集合中。 threads.add(t1); threads.add(t2); threads.add(t3); t1.start(); t2.start(); t3.start(); //循环遍历矢量集合中的 Thread ,并等待结束 //等待支线程全部结束后再 打印“票全部卖完” for (Thread iThread : threads) { try { iThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("票全部都卖出"); } }
要学习线程的同步就要来了解 synchronized 这个关键词:
转自http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
Java语言的关键字 synchronized,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
以上规则对其它对象锁同样适用.
相关文章推荐
- 【Java多线程共享数据、同步、通信】
- IBM Java多线程 - 4.共享对数据的访问
- java面试题二十九 多线程数据共享问题
- java多线程并发库高级应用 之 多个线程之间共享数据的方式探讨
- java基础巩固笔记(5)-多线程之共享数据
- java多线程采集+线程同步-【多线程数据采集之四】
- JAVA笔记14__多线程共享数据(同步)/ 线程死锁 / 生产者与消费者应用案例 / 线程池
- Java基础:多线程之线程范围内的数据共享ThreadLocal
- Java多线程与并发应用-(6)-多个线程之间共享对象和数据的方式
- java基础多线程之共享数据
- java多线程与线程并发四:线程范围内的共享数据
- Java多线程共享数据、同步、通信
- java核心知识点学习----多线程间的数据共享的几种实现方式比较
- Java笔记16:多线程共享数据
- java 多线程读取数据注意伪共享
- java多线程与线程并发五:多个线程访问共享对象和数据的方式
- java多线程共享数据和数据并发
- UNIX多线程数据共享与线程同步
- java基础多线程之共享数据
- JAVA多线程之间共享数据BlockingQueue介绍