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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 花之都双鱼 中级黑马   /  2014-9-26 22:36  /  1081 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

多线程中同步有哪几种实现方式啊?能否举个例子

5 个回复

倒序浏览
有两种,一种是同步代码块, 用法:
                  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. }
复制代码

评分

参与人数 1技术分 +2 收起 理由
敏敏好学 + 2 很给力!

查看全部评分

回复 使用道具 举报
学习了。
回复 使用道具 举报
学习了。
回复 使用道具 举报
雨下阳光 发表于 2014-9-27 12:31
有两种,一种是同步代码块, 用法:
                  synchronized(对象)
                  {需要被同 ...

好详细,谢谢回答
回复 使用道具 举报
学习了。。。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马