- package cn.itcast_11;
- /*
- * A:同步代码块的锁对象是谁呢?
- * 任意对象。
- *
- * B:同步方法的格式及锁对象问题?
- * 格式:把同步关键字加在方法上。
- *
- * 同步方法锁对象是谁呢?
- * 默认this
- *
- * C:静态方法及锁对象问题?
- * 静态方法的锁对象是谁呢?
- 默认当前类的Class文件
- * 类的字节码文件对象。(反射会讲)
- public class SellTicket implements Runnable {
- // 定义100张票
- private static int tickets = 100;
- // 定义同一把锁
- private Object obj = new Object();
- private Demo d = new Demo();
- private int x = 0;
-
- @Override
- public void run() {
- while (true) {
- if(x%2==0){
- synchronized (obj) {
- if (tickets > 0) {
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName()
- + "正在出售第" + (tickets--) + "张票 ");
- }
- }
- }else {
- sellTicket();//默认的对象时this
- }
- x++;
- }
- }
-
- //如果一个方法一进去就看到了代码被同步了,那么我就把这个同步加在方法上
- private static synchronized void sellTicket() {
- if (tickets > 0) {
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println(Thread.currentThread().getName()
- + "正在出售第" + (tickets--) + "张票 ");
- }
- }
- }
复制代码
|
|