黑马程序员技术交流社区

标题: 多线程中同步有几种实现方式 [打印本页]

作者: 花之都双鱼    时间: 2014-9-26 22:36
标题: 多线程中同步有几种实现方式
多线程中同步有哪几种实现方式啊?能否举个例子

作者: 雨下阳光    时间: 2014-9-27 12:31
有两种,一种是同步代码块, 用法:
                  synchronized(对象)
                  {需要被同步的代码}
  1. /*       
  2. 给卖票程序示例加上同步代码块。
  3. */
  4. class Ticket implements Runnable
  5. {
  6.         private int tick=100;
  7.         Object obj = new Object();
  8.         public void run()
  9.         {
  10.                 while(true)
  11.                 {
  12.                         //给程序加同步,即锁
  13.                         synchronized(obj)
  14.                         {
  15.                                 if(tick>0)
  16.                                 {
  17.                                         try
  18.                                         {       
  19.                                                 //使用线程中的sleep方法,模拟线程出现的安全问题
  20.                                                 //因为sleep方法有异常声明,所以这里要对其进行处理
  21.                                                 Thread.sleep(10);
  22.                                         }
  23.                                         catch (Exception e)
  24.                                         {
  25.                                         }
  26.                                         //显示线程名及余票数
  27.                                         System.out.println(Thread.currentThread().getName()+"..tick="+tick--);
  28.                                 }
  29.                         }       
  30.                 }
  31.         }
  32. }
复制代码


另一种是同步函数,
格式:
                在函数上加上synchronized修饰符即可。
  1. class Ticket implements Runnable
  2. {
  3.         private int tick=100;
  4.         Object obj = new Object();
  5.         public void run()
  6.         {
  7.                 while(true)
  8.                 {
  9.                         show();
  10.                 }
  11.         }
  12.   //直接在函数上用synchronized修饰即可实现同步
  13. public synchronized void show()
  14. {
  15.                 if(tick>0)
  16.             {
  17.                 try
  18.                 {       
  19.                         //使用线程中的sleep方法,模拟线程出现的安全问题
  20.                         //因为sleep方法有异常声明,所以这里要对其进行处理
  21.                         Thread.sleep(10);
  22.                 }
  23.                 catch (Exception e)
  24.                 {
  25.                 }
  26.                 //显示线程名及余票数
  27.                 System.out.println(Thread.currentThread().getName()+"..tick="+tick--);
  28.         }
  29. }       
  30. }
复制代码

作者: 小城。    时间: 2014-9-27 12:49
学习了。
作者: 在学野马    时间: 2014-9-27 15:07
学习了。
作者: 花之都双鱼    时间: 2014-9-27 15:24
雨下阳光 发表于 2014-9-27 12:31
有两种,一种是同步代码块, 用法:
                  synchronized(对象)
                  {需要被同 ...

好详细,谢谢回答
作者: rel4x    时间: 2014-9-27 21:17
学习了。。。。。





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