黑马程序员技术交流社区

标题: 多线程安全问题解决总结 [打印本页]

作者: 122125241    时间: 2015-7-3 21:18
标题: 多线程安全问题解决总结
  1. package cn.itcast_11;
  2. /*
  3. * A:同步代码块的锁对象是谁呢?
  4. *                 任意对象。
  5. *
  6. * B:同步方法的格式及锁对象问题?
  7. *                 格式:把同步关键字加在方法上。
  8. *
  9. *                 同步方法锁对象是谁呢?
  10. *                         默认this
  11. *
  12. * C:静态方法及锁对象问题?
  13. *                 静态方法的锁对象是谁呢?
  14.             默认当前类的Class文件
  15. *                         类的字节码文件对象。(反射会讲)
  16. public class SellTicket implements Runnable {
  17.         // 定义100张票
  18.         private static int tickets = 100;
  19.         // 定义同一把锁
  20.         private Object obj = new Object();
  21.         private Demo d = new Demo();
  22.         private int x = 0;
  23.        
  24.         @Override
  25.         public void run() {
  26.                 while (true) {
  27.                         if(x%2==0){
  28.                                 synchronized (obj) {
  29.                                         if (tickets > 0) {
  30.                                                 try {
  31.                                                         Thread.sleep(100);
  32.                                                 } catch (InterruptedException e) {
  33.                                                         e.printStackTrace();
  34.                                                 }
  35.                                                 System.out.println(Thread.currentThread().getName()
  36.                                                                 + "正在出售第" + (tickets--) + "张票 ");
  37.                                         }
  38.                                 }
  39.                         }else {
  40.                                 sellTicket();//默认的对象时this
  41.                         }
  42.                         x++;
  43.                 }
  44.         }
  45.        
  46.         //如果一个方法一进去就看到了代码被同步了,那么我就把这个同步加在方法上
  47.         private static synchronized void sellTicket() {
  48.                 if (tickets > 0) {
  49.                 try {
  50.                                 Thread.sleep(100);
  51.                 } catch (InterruptedException e) {
  52.                                 e.printStackTrace();
  53.                 }
  54.                 System.out.println(Thread.currentThread().getName()
  55.                                         + "正在出售第" + (tickets--) + "张票 ");
  56.                 }
  57. }
  58. }
复制代码



作者: 十五号的人生    时间: 2015-7-3 21:31
菜鸟飘过      
作者: 122125241    时间: 2015-7-3 21:33
十五号的人生 发表于 2015-7-3 21:31
菜鸟飘过

坚持到无能为力,努力到感动自己




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2