黑马程序员技术交流社区

标题: 多线程同步问题中执行语句的问题 [打印本页]

作者: 黄陂酷歌    时间: 2014-3-22 15:22
标题: 多线程同步问题中执行语句的问题
  1. class Single{
  2.         private static Single s = null;
  3.         private Single(){}
  4.         public static Single getInstance(){
  5.                 if(s==null){
  6.                         synchronized(Single.class){
  7.                                 if(s==null)                                //应为对s用两条语句所以可能产生多线程安全问题
  8.                                         s = new Single();   
  9.                         }
  10.                 }
  11.                 return s;
  12.         }
  13. }
复制代码

我想问的是毕老师说要是只用一条语句就不会产生多线程的安全问题,但是我学过汇编,我们知道一条java的执行语句在汇编里面可能是多条执行语句,而cpu执行的步骤更像汇编的语法那样,一天java执行语句可能需要cpu执行多条指令,这样看来即使是一条java执行语句也可能在执行一条cpu指令后切换?难道cpu能识别java执行语句?确保执行完一条java语句(假设是3条cpu指令)后在切换到其他位置区执行?
作者: 龙健    时间: 2014-3-22 22:03
个人理解是这样的,的确cpu是在不断的切换执行任务的,可是当cpu切换到其他任务的时候,此任务就有了执行资格,但是没有执行权,故不会执行其他任务,所以给我们的感觉就是cpu只执行同步代码块中的任务一样,个人理解,仅供参考
作者: 牛头人图腾    时间: 2014-3-23 12:42
Cpu是不会识别JAVA语句的,无论你什么语言编写的程序最后还是要机器语言的形式被执行。语句是高级语言中的称谓,对应多条指令。即使是单条语句也会产生线程安全问题。
1、单条语句:像赋值语句 int a = 3,Person p = new Person()如果你的Person类中属性多,这条语句可能会被翻译成十几条或几十条语句。
2、复合语句,包含了一条或多条的代码单元,习惯被称为块。例{int a =3;System.out.println(a);}
3、控制语句,if、switch、for语句之类的。其实这类语句被编译了会有一条jump指令。
用高级语言编写程序我们是方便了很多,编译器帮我们做了很多事,但有些地方理解起来确很困难,因为你不知道它帮你做了什么,就像线程同步的问题,对象往那里一放就有锁了同步了,其实没那么简单对应很多指令。高级语言编写的程序最后还是要和具体cpu指令集中的指令对应。楼主学过汇编,应该是有一颗寻根问题的心,这是很好的,但对于先阶段的学习可能不是很适合,因为如果把整个流程都弄懂了要花费太多的时间了,现在还是只关注现有问题领域的问题好点。加油!
作者: 霍振鹏    时间: 2014-3-23 14:42
个人感觉即使是一条语句(内部分为多条执行),也会产生线程安全问题。




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