本帖最后由 linweiwen 于 2014-3-30 17:01 编辑
- package com.itheima;
- /*
- * 四个窗口同时卖1000张票。
- * */
- public class sellTicket {
- public static void main(String args[]) {
- myTicket t = new myTicket();
- Thread Mt1 = new Thread(t);
- Thread Mt2 = new Thread(t);
- Thread Mt3 = new Thread(t);
- Thread Mt4 = new Thread(t);
- Mt1.start();
- Mt2.start();
- Mt3.start();
- Mt4.start();
- }
- }
- class myTicket implements Runnable {
- private static int ticket = 100;
- Object obj = new Object();
- @Override
- public void run() {
- synchronized (obj) {
- while (ticket > 0) {
-
- try {
- Thread.sleep(2);
- System.out.println(Thread.currentThread().getName() + " : "
- + ticket--);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }
- }
复制代码
首先,上面代码是正常的情况。
然后我想问两个问题:
1.为什么我把while的循环条件剔除在同步代码块外面,就会出现结果不安全的问题。
- while (ticket > 0) {
- synchronized (obj) {
- try {
复制代码 while (ticket > 0)也算是操作共享数据的语句?
大家一般怎么判断同步代码块的范围的?视频教程里面的不够具体啊。
2.为什么synchronzied()中直接生产一个Object传进去,而不是传一个已经new出来的对象,
就会出现问题?
- synchronized (new Object()) {
- while (ticket > 0) {……
-
复制代码 不是传入一个对象就OK 了吗?
请各位帮忙解答一下,谢谢:)
|