有两道Java多线程的面试题能不能帮我看看? 本帖最后由 sinat_24152013 于 2015-01-06 07:14:37 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 第一题:f.remove(i);效率太低,改成iterator.remove形式。第二题:synchronized (results) 这个锁的范围太大了。还有synchronized (lock)这里的lock是在方法内部new的,这样应该不对,每个线程在执行这段代码时都会new出新的lock,达不到锁的效果(我是这样理解的,欢迎指正)。 第一题:1.为什么要 synchronized (lock) ,你之前的 List lock = new ArrayList() 预示每个线程进来都是不同的lock对象。2.就像2楼所说删除的方式改为iterator.remove形式3.你这题本身没和多线程扯上关系呢,如果真想用多线程完成,那么可以先进行并行的快速排序,记录最后一个null的位置,排序完就知道结果了。第二题:1.实现思路不太对....,你所要实现不就是各子线程完成业务然后对自己的私有属性dnaList、results更新么,然后主线程要能够获取到各子线程属性状态?那么基本上可以这样实现: class Scanthread implements Runnable{ ConcurrentLinkedQueue dnaList; volatile Object results; public void run() { //具体业务操作 } } class Mainthread implements Runnable{ //存放各子线程变量数组 ConcurrentLinkedQueue[] dnaLists; Object[] results; public void run() { //具体迭代获取子线程操作 } }2.我使用的集合组件你可以自己网上搜一下,看看他的并发特性。 关于第一题我就想不明白了,为什么不在放的时候把 null 给过滤掉? 第一题:改成iterator.remove形式。第二题:如果只是存放结果 results.setProperty(key, String.valueOf(Integer.valueOf(results.getProperty(key)) + 1)); 没有其他操作,不存在同步问题,是不需要加锁的。 第一个可以多线程并行处理,建临时的全局线程安全的list,然后把所有不为null的直接塞进去不好么?可以省掉你remove了。 1 lock这个对象完全没用,凡是有的地方全部删掉 2 synchronized (results) 这个去掉synchronized (lock) 改成 synchronized (results) 第二题能不能帮我写个例子?上面就算例子了啊,你自己加入业务逻辑就行了,启动的时候用JDK线程池装载 首先第一题, 这种删除方法是错误的. null不能完全清除.然后不明白跟多线程有什么关系,最后楼上已经有合适的方法. 高手。。麻烦了。。生成扑克牌问题 100分! 怎样用一种简便的方法让ArrayList中的元素反顺序? 100分的问题! 单词查找算法?急!!! 很菜的问题. 想听听大家对 static 命名的函数、变量的用法 java 做 ftpclient如何 取得ftp服务器文件的列表..急 请教一个在JavaScript中调用嵌入对象的方法属性的问题 一个scjp的题------关于重载 小弟主要开发MIS,现在用VB,ASP,想学JAVA,不知哪位高手指点一二学它对于MIS来说用处大吗? 为毛没人回复我呢 在其他类中访问UI组件
第二题:synchronized (results) 这个锁的范围太大了。还有synchronized (lock)这里的lock是在方法内部new的,这样应该不对,每个线程在执行这段代码时都会new出新的lock,达不到锁的效果(我是这样理解的,欢迎指正)。
1.为什么要 synchronized (lock) ,你之前的 List lock = new ArrayList() 预示每个线程进来都是不同的lock对象。
2.就像2楼所说删除的方式改为iterator.remove形式
3.你这题本身没和多线程扯上关系呢,如果真想用多线程完成,那么可以先进行并行的快速排序,记录最后一个null的位置,排序完就知道结果了。第二题:
1.实现思路不太对....,你所要实现不就是各子线程完成业务然后对自己的私有属性dnaList、results更新么,然后主线程要能够获取到各子线程属性状态?那么基本上可以这样实现: class Scanthread implements Runnable{ ConcurrentLinkedQueue dnaList;
volatile Object results;
public void run() {
//具体业务操作
} }
class Mainthread implements Runnable{ //存放各子线程变量数组
ConcurrentLinkedQueue[] dnaLists;
Object[] results;
public void run() {
//具体迭代获取子线程操作
} }
2.我使用的集合组件你可以自己网上搜一下,看看他的并发特性。
第二题:如果只是存放结果 results.setProperty(key, String.valueOf(Integer.valueOf(results.getProperty(key)) + 1)); 没有其他操作,不存在同步问题,是不需要加锁的。
2 synchronized (results) 这个去掉synchronized (lock) 改成 synchronized (results)
第二题能不能帮我写个例子?上面就算例子了啊,你自己加入业务逻辑就行了,启动的时候用JDK线程池装载