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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘乃宽 中级黑马   /  2013-9-6 21:56  /  1526 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨增坤 于 2013-9-9 20:04 编辑

就是线程中“同步”二字的意思,也许有人觉得这不算问题,但是我一直不理解,听到同步总感觉怪怪的,一点没有同步的感觉。
大家谁理解的好帮我说说呗  , 就用例题吧。
  1. class Ticket implements Runnable
  2. {
  3.         private  int tick = 1000;
  4.         Object obj = new Object();
  5.         public void run()
  6.         {
  7.                 while(true)
  8.                 {
  9.                         synchronized(obj)
  10.                         {
  11.                                 if(tick>0)
  12.                                 {
  13.                                         //try{Thread.sleep(10);}catch(Exception e){}
  14.                                         System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
  15.                                 }
  16.                         }
  17.                 }
  18.         }
  19. }


  20. class  TicketDemo2
  21. {
  22.         public static void main(String[] args)
  23.         {

  24.                 Ticket t = new Ticket();

  25.                 Thread t1 = new Thread(t);
  26.                 Thread t2 = new Thread(t);
  27.                 Thread t3 = new Thread(t);
  28.                 Thread t4 = new Thread(t);
  29.                 t1.start();
  30.                 t2.start();
  31.                 t3.start();
  32.                 t4.start();
  33.         }
  34. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
EYE_SEE_YOU + 1

查看全部评分

12 个回复

倒序浏览
为什么要叫同步呢,同步体现在哪儿
回复 使用道具 举报
本帖最后由 常在河边走_ 于 2013-9-6 22:27 编辑

当一个数同时被多条线程操作的时候,就会出现线程安全问题,出现的原因就是因为线程访问的延迟,以及线程执行的随机性。
同步的具体体现就是把可能出问题的代码用一个东西包围起来,在某一个线程执行的时候,其他线程都不能访问。直到这个线程结束。
在使用多线程的过程中,判断代码是否需要同步的方法是:A:程序被多个线程访问
B:有共享数据
C:共享数据被多条语句操作




评分

参与人数 1技术分 +1 收起 理由
薛鹏鹏 + 1

查看全部评分

回复 使用道具 举报
t1------------------>
   t2------------------->
        t3------------------>
              t4---------------->
而不是 t1--------------->t2---------------->t3--------------->t4-------------->
回复 使用道具 举报
我也是觉得怪怪的 明明就是不让人家线程同时执行的代码  叫什么同步嘛   
后来想想。同步代码是需要,要被许多线程执行的代码。哪一个线程都会执行的啊。而不想别的代码一样只有主线程一个线程去执行的。。。。。所以,人家确实是应该叫同步的。
回复 使用道具 举报
李锡碧 发表于 2013-9-6 22:24
t1------------------>
   t2------------------->
        t3------------------>

这个叫做多线程吧
回复 使用道具 举报
辛春鹏 发表于 2013-9-6 22:33
我也是觉得怪怪的 明明就是不让人家线程同时执行的代码  叫什么同步嘛   
后来想想。同步代码是需要,要被 ...

还是晕 , 我再看看视频去
回复 使用道具 举报
同步就是一个线程需要执行多行代码,等它从头执行到结束,才允许其他的线程执行这些代码
回复 使用道具 举报
我认为不可以只看同步两个字的意思,而应该将synchronized看成是一个锁才准确,就好像lock(),和unlock()一样,代码块被同步后,可以认为是产生了一把唯一的锁,那个线程要运行同步的代码块则必须要先要拥有这把锁。
回复 使用道具 举报
刘乃宽 发表于 2013-9-6 22:41
这个叫做多线程吧

呜呜呜,又看了下你的提问,我搞错了,不好意思啊。{:soso_e127:}

线程 一个独立运行的程序,线程和其他线程会共享一些资源,然而这就会引起一些问题,可能会因为抢夺资源而发生冲突。因此引出了同步机制。

即各位线程之间要有个先来后到的去利用资源。
1.线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行。
2.是“共享”这两个字。只有共享资源的读写访问才需要同步。如果不是共享资源,那么就根本没有同步的必要。
3.只有变量才需要同步访问。如果共享资源是固定不变的,相当于常量,线程读取常量也不需要同步。至少一个线程修改共享资源,这样的情况下,多线程才要同步。
4.多个线程访问共享资源的代码有可能是同一份代码,也有可能是不同的代码;无论是否执行同一份代码,只要这些线程的代码访问同一份可变的共享资源,这些线程之间就需要同步。



回复 使用道具 举报
李锡碧 发表于 2013-9-6 23:14
呜呜呜,又看了下你的提问,我搞错了,不好意思啊。

线程 一个独立运行的程序,线程和其他 ...

线程同步就是线程排队。同步就是排队。线程同步的目的就是避免线程“同步”执行
{:soso_e179:}     这么想不错
回复 使用道具 举报
就是同时启动了多个线程,多个线程共享资源,就是买票,就是多个窗口可以同时操作同一个资源,而不是自己操作自己的。
public class MyThread implements Runnable {
   private int titck=5;
       public void run(){
           for(int i=0;i<100;i++)
             if(this.titck>0){
                  System.out.println("卖票了"+this.titck--);
         }
       }
}
public class text {
   public static void main(String [] agrs){
      MyThread t1=new MyThread();
      new Thread(t1).run();
      new Thread(t1).run();
      new Thread(t1).run();
}
}结果:
卖票了5
卖票了4
卖票了3
卖票了2
卖票了1
总结:同样是启动了三个线程,这是才是想要的结果,达到了资源共享。他们不是并发的操作,要是并发的话把run()方法改为start()
回复 使用道具 举报
楼主,你好!


如果您的问题解决了,请把您问题的未解决更改为已解决

谢谢合作!

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马