黑马程序员技术交流社区

标题: 多线程中同步代码块问题 [打印本页]

作者: 闫月乐    时间: 2013-6-6 10:42
标题: 多线程中同步代码块问题
本帖最后由 闫月乐 于 2013-6-6 21:14 编辑

多线程的问题:
就那毕老师视频中讲的那个售票程序来说吧
1,为啥里面要用死循环啊?while(true)
2,多线程里面加上了同步代码块,牺牲了程序的性能提高了安全性,那这里岂不是和单线程一样?
还是说:同步代码块只是程序的一小部分,只有在运行到这里时才会单线程运行,代码块外还是提高了效率?有点晕晕呼呼的,麻烦大家结合好懂的例子
说一下多线程加上同步代码块,是不是和直接单线程一样了??
  1. /*
  2. * 4个窗口同时售票,总票数为100张,多线程思想
  3. */
  4. //定义一个类去实现Runnable接口,这种方法避免了单继承的局限性,
  5. class Ticket implements Runnable{
  6. private int ticket=100;
  7. //Runnable中只有一个run方法,用于存储线程汇总运行的代码,被实现需要覆盖该方法,
  8. public void run(){
  9. //1,为什么要定义成死循环??又或者说是不是在知道循环次数是时就可以不定义成死循环了?
  10. while(true){
  11. //同步代码块
  12. synchronized(this){
  13. //用于检测程序的安全性,而sleep()方法中有可能引发一场,所以要用try..catch,否则编译出错.
  14. //Thread.sleep()让线程进入睡眠,模拟现实中临时故障的发生
  15. try{
  16. Thread.sleep(10);
  17. }
  18. catch(Exception e){
  19. System.out.println(e.getMessage());
  20. }
  21. if(ticket>0){
  22. System.out.println(Thread.currentThread().getName()+"刚刚售卖完第"+ticket--+"张票");
  23. }

  24. }
  25. }
  26. }

  27. }
  28. public class TicketTest {
  29. public static void main(String[] args){
  30. Ticket tk=new Ticket();
  31. /*创建四个线程,开了四个窗口,Thread类中有Thread(Runnable target)构造方法,当向该方法传递
  32. Runnable接口的类对象时,创建的线程会直接调用类对象中的run()方法作为它的运行代码.*/
  33. Thread t1=new Thread(tk);
  34. Thread t2=new Thread(tk);
  35. Thread t3=new Thread(tk);
  36. Thread t4=new Thread(tk);
  37. //给线程取名字,纯属好看
  38. t1.setName("1号窗口");
  39. t2.setName("2号窗口");
  40. t3.setName("3号窗口");
  41. t4.setName("4号窗口");
  42. //使线程开始执行
  43. t1.start();
  44. t2.start();
  45. t3.start();
  46. t4.start();

  47. }
复制代码

作者: 刘凯    时间: 2013-6-6 10:57
1.wihle(ture)循环是保证这个程序循环执行,买票不会只卖出一张就结束吧。。  可能你还没有看到后边,后边会讲到停止线程,就是把while(flag)通过改变flsg的值来停止线程
2.同步代码块 上边必须有锁,以后同一个锁的同步代码块 或者是同步函数 才会判断是否持有锁 并依此执行 ,不是同一个所得同步代码块或者是同步函数 一样可以并发执行 这样必然会提高程序的运行效率
因此 多线程加上同步代码块 不一定就和单线程一样了
作者: 王鑫    时间: 2013-6-6 11:26
问题1.这个程序的目的就是为了看到多线程出现安全性问题的现象,循环100次未必就能使现象出现,
         所以用wihle(true)循环是为了保证程序持续执行以使现象发生。
问题2.首先,同步代码块的前提之一就是必须要有两个或以上的多线程,所以有同步必然是多线程,不可能是单线程。
         另外,这里说的降低效率是因为加入同步代码块后,每个线程需要对代码块上的锁进行判断,多了一次判断操作所以降低了程序的效率。
         并不是说代码块内降低了效率,代码块外提高了效率。




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