A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张宝 中级黑马   /  2013-3-29 22:40  /  992 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


  1. /*
  2. 多线程的安全问题。


  3. 安全问题产生的原因:

  4. 1,多个线程在操作共享数据。
  5. 2,操作共享数据的代码有多条。
  6. 一个线程在执行多条操作共享数据的过程中,其他线程参数与了运算,这时就会发生安全问题。

  7. 想要分析是否安全问题:
  8. 依据:线程任务中有没有共享数据,该数据是否被多条语句操作啊。



  9. 解决方案:只要保证一个线程在执行多条操作共享数据的语句时,其他线程不能参与运算即可。
  10.                 当该线程都执行完后,其他线程才可以执行这些语句。

  11. 代码表现:java中给我们提供具体的解决语句。
  12.                 那就是同步代码块。
  13.                 格式:
  14.                 synchronized(对象)//对象可以是任意的对象。
  15.                 {
  16.                         需要被同步的语句。
  17.                 }


  18. 同步的原理:其实就是将需要同步的代码进行封装,并在该代码上加了一个锁。

  19. 同步的好处:解决多线程的安全问题。

  20. 同步的弊端:会降低性能。

  21. 一种现象:出现了多线程安全问题,为了解决,加上同步,发现,问题依旧。
  22. 怎么办?

  23. 同步的前提:
  24.         必须要保证在同步中有多个线程。因为同步中只有一个线程该同步是没有意义。
  25.         必须要保证多个线程在同步中使用的是同一个锁。

  26.         必须保证多个线程使用的锁是同一个。
  27.         这时才成为多个线程被同步了。

  28. */

  29. class Ticket implements Runnable
  30. {
  31.         private int num = 200;
  32.         Object obj = new Object();
  33.         public void run()
  34.         {
  35.                 while(true)
  36.                 {
  37.                         synchronized(obj)
  38.                         {
  39.                                 if(num>0)
  40.                                 {
  41.                                         try{Thread.sleep(10);}catch(InterruptedException e){}
  42.                                         System.out.println(Thread.currentThread().getName()+".....sale....."+num--);
  43.                                 }
  44.                         }
  45.                 }
  46.         }
  47. }

  48. class ThreadSynDemo
  49. {
  50.         public static void main(String[] args)
  51.         {
  52.                 Ticket t = new Ticket();
  53.                
  54.                 //创建线程对象。
  55.                
  56.                 Thread t1 = new Thread(t);
  57.                 Thread t2 = new Thread(t);
  58.                 Thread t3 = new Thread(t);
  59.                 Thread t4 = new Thread(t);

  60.                 t1.start();
  61.                 t2.start();
  62.                 t3.start();
  63.                 t4.start();

  64.         }
  65. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马