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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈红建 中级黑马   /  2012-8-1 17:03  /  1915 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么线程访问同一组数据会出问题(我想知道原因)?
Runnable为什么不Therad创建进程要好?(可以用代码举例吗?)
能不能帮我解释一下 for的加强 是怎么回事,就是那个for(:)里面有冒号那个
switch的条件可以是 一个类或者对象 或者是 一个方法的返回值吗?
如果有代码演示的话 我会非常感谢的

点评

楼主这一个问题涵盖了多个方面,建议从切实的实例出发进行理解!  发表于 2012-8-1 19:08

1 个回复

倒序浏览
本帖最后由 郑正华 于 2012-8-1 18:48 编辑

1.为什么线程访问同一组数据会出问题?
因为线程是并发执行的,就跟赛跑似的,谁领先谁就先运行。举个例子,比如你的代码中有个变量 x = 1;每访问一次就x++;当一个线程A想要访问这一组数据时,本来这个线程想要得到x的最初值,也就是1,但是另外一个线程B抢先访问了这组数据,于是因为执行了x++;所以x变成2了,那线程A不就火大了么,没有访问到x的最初值,这就是线程的安全问题!
生活中的例子就是去食堂买饭,本来你正准备刷卡买下最后3根油条,有一哥们冲了过来,抢先把卡刷了,拿下那3根油条,那你不得揍他一顿!这不就出问题了!没有规矩不成方圆,所以要排队买饭,也就是后来的线程同步!

2.Runnable为什么比Thread创建进程要好?(可以用代码举例吗?)
因为实现Runnable接口可以避免java 单继承的局限性,举个例子,比如A类继承了B类,可是现在A类里有块代码想要用多线程执行,就是想要被共享,那因为java只支持单继承的模式,所以A类就不能再继承Thread类了,但是你如果实现Runnable接口。你不仅可以继续继承B类,还可以实现多线程了~
两种方式的其他区别:
继承Thread类:线程代码存放在Thread子类的run方法中。
实现Runnable接口:线程代码存放在接口的子类的run 方法中。
在这里强烈建议你看一下毕老师的java基础教程视频第11天07和08视频,售票的例子,创建线程-实现Runnable接口,看了之后你就一清二楚了!

3.能不能帮我解释一下 for的加强 是怎么回事,就是那个for(:)里面有冒号那个?
增强for循环内部是使用的Iterator来遍历的,只能遍历数组和实现了Iterable接口的集合。优点是写法简便,无需获得数组、集合长度,也无需根据索引来访问元素。缺点是不能在循环里动态的删除元素和获取元素下标。
增强型的for循环 优点主要体现在集合中,随便举个例子,你看增强for循环的写法是不是简洁!
比如对 set 的遍历
一般的迭代遍历写法:
Set<String> set = new HashSet<String>();
Iterator<String> it = set.iterator();
while (it.hasNext()) {
     String str = it.next();
      System.out.println(str);
}
------------------------------------
增强for循环遍历写法:
for (String str : set) {
      System.out.println(str);
}
----------------------------------

4.switch的条件可以是 一个类或者对象 或者是 一个方法的返回值吗?
switch语句的判断条件可以接受int,byte,char,short,还有枚举,顺便提一下,JDK7.0的新特性,枚举开始支持字符串了!


评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

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