s****y 发帖数: 503 | 1 多线程共同扫描,主线程在多线程中启动scan方法,每个线程都有
一个私有的list,每个线程共享一个“results”对象来向主线程报告进度,
成功扫描次数必须精确。请改正和修改scan方法以提高任务性能。
private interface Data {
public boolean scan();
}
public void scan(List list, Properties results) {
synchronized (results) {
Iterator i = list.iterator();
Object lock = new Object();
while (i.hasNext()) {
if (i.next().scan()) {
String key = "scan performed";
synchronized (lock) {
results.setProperty(key, String.valueOf(Integer.valueOf(
results.getProperty(key)) + 1));
}
}
}
}
} | c***t 发帖数: 54 | 2 synchronized (results), 这里错了。list是每个call都有的, 那就不需要
synchronize. 而是应该让所有线程同时计算每个list的scan(). scan() 的次数应该
remember local, 然后在一次update property. results.getProperty(key)) + 1))
也是不好,update property too many times.
这样应该快很多, 但是要跟面试官说明property does not increment by 1 every
time anymore.
public final static String KEY = "scan performed";
public void scan(List list, Properties results) {
int successfulScans = 0;
Iterator i = list.iterator();
while (i.hasNext()) {
if (i.next().scan()) {
successfulScans++;
}
}
# No need for explicit synchronized since a Properties instance is thread
safe.
results.setProperty(KEY, String.valueOf(Integer.valueOf(results.
getProperty(KEY)) + successfulScans ));
}
如果我做错了, 请各位不要骂~~~ | o***e 发帖数: 28 | 3 # No need for explicit synchronized since a Properties instance is thread
safe.
results.setProperty(KEY, String.valueOf(Integer.valueOf(results.
getProperty(KEY)) + successfulScans ));
这一行错了 (因为 results.getProperty 和 results.setProperty 必须被包含在一个
atomic operation 里面), 应为
synchronized (results) {
results.setProperty(KEY, String.valueOf(Integer.valueOf(results.
getProperty(KEY)) + successfulScans));
} | o***e 发帖数: 28 | 4 除此之外都挺好的 上面那些话也都说得很对:
synchronized (results), 这里错了。list是每个call都有的, 那就不需要
synchronize. 而是应该让所有线程同时计算每个list的scan(). scan() 的次数应该
remember local, 然后在一次update property. results.getProperty(key)) + 1))
也是不好,update property too many times. | g*****g 发帖数: 34805 | 5 java 1.5之后但凡用synchronize基本就是做错了。一可以split list起多线程,或者
Java8 parellel streaming. 二用个ConcurrentHashMap套AtomicInteger计数就行了。
Properties是基于HashTable的,性能很差。
【在 o***e 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 除此之外都挺好的 上面那些话也都说得很对: : synchronized (results), 这里错了。list是每个call都有的, 那就不需要 : synchronize. 而是应该让所有线程同时计算每个list的scan(). scan() 的次数应该 : remember local, 然后在一次update property. results.getProperty(key)) + 1)) : 也是不好,update property too many times.
| p****w 发帖数: 90 | 6 nn【在 sallay (sallay)的大作中提到:】n:多线程共同扫描,主线程在多线程中启
动scan方法,每个线程都有n:一个私有的list,每个线程共享一个“results”对象来
向主线程报告进度,n:成功扫描次数必须精确。请改正和修改scan方法以提高任务性
能。n:n:private interface Data {n: public boolean scan();n:}n……nn--n
[发自未名空间Android客户端] | s******7 发帖数: 1758 | 7 这个题不难,因为是local list, 所以scan list的时候不需要考虑同步,只需要最后
update result的时候synchronize一下就可以了。里面那个lock也是local的,锁不锁
完全不起任何作用。
public void scan(List list, Properties results) {
Iterator i = list.iterator();
Object lock = new Object();
while (i.hasNext()) {
if (i.next().scan()) {
String key = "scan performed";
synchronized (results) {
results.setProperty(key, String.valueOf(Integer.valueOf(
results.getProperty(key)) + 1));
}
}
}
}
如果允许改变result的结构,就用 actomicInteger, 会简单的多 | o***e 发帖数: 28 | 8 哈 我以为原作者的意思是必须用 Properties 来记录结果呢 .. 如果可以随便改的话
当然把 Properties 换成 AtomicInteger 啦
【在 g*****g 的大作中提到】![](/moin_static193/solenoid/img/up.png) : java 1.5之后但凡用synchronize基本就是做错了。一可以split list起多线程,或者 : Java8 parellel streaming. 二用个ConcurrentHashMap套AtomicInteger计数就行了。 : Properties是基于HashTable的,性能很差。
| a****n 发帖数: 26 | 9 请问 如何准备这样的多线程问题 应该看什么资料。
thanks | s****e 发帖数: 1648 | 10 Java 7 Concurrency Cookbook
【在 a****n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 请问 如何准备这样的多线程问题 应该看什么资料。 : thanks
| s***f 发帖数: 457 | 11 发信人: svcef (svcef), 信区: JobHunting
标 题: 你是否愿意通过自学转行成为一个软件工程师
发信站: BBS 未名空间站
(这个机会仅仅适用于位于硅谷南湾的人, 谢谢。 Our office is on Walsh Ave,
Santa Clara. CA, 95050 )
这个帖子, 前一阵子, 发过一次, 由于大家反馈非常好, 就再发一次, 希望对更
多的朋友有帮助。绝对不收任何费用, 我们提供完全免费的转行软件工程师的机会。
这个帖子是写给那些朋友, 以前由于各种原因, 没能够成为计算机专业学
生,现在愿意通过自学成为一个软件工程师.
这可以做到嘛 ?
实际上, 任何人通过自学成为一个软件编程的高手都不是什么难的事情。只要肯花许
多时间学习和练习, 加上有人可以指导答疑, 每个愿意成为软件工程师的人都可以通
过一段时间的学习成为一个不错的软件工程师。
如果你正想成为一个软件工程师, 请联系我们。 我们能够提供机会帮助你成为一个软
件工程师。绝对不收任何费用。
我们提供一个边工作, 边学习的机会。
只有一个要求, 希望你现在还有努力学习的动力和勤奋精神。
注1: 许多软件编程的高手都不是计算机专业学生. 举例来说, 微软的Bill Gates,
Facebook的Mark Zuckerberg, 都是软件编程的高手,但都不是学计算机专业的. Bill
Gates本来大概要学法律, Mark Zuckerberg本来是心理学专业的。
只要你有真材实料, 转行到软件, 是不需要一个CS的学位的。
注2: 如果您本身是一个软件工程师, 读到这个帖子, 请您手下留情, 请不要为
“码工”这个职业泼冷水。您也许不知道, 有许多人羡慕你的职业呢 ? 正想成为一
个软件工程师 ? 软件工程师, 工作有挑战性, 收入也不错。我们就是希望提供机会
给这样的朋友。
注3: 我们不承诺给任何人办H-1B, 但如果优秀的, 我们团队愿意自己留下来的,
我们可以帮助办H-1B.
注4: 我们这个项目绝对不收任何费用。
注5: 我们和硅谷任何别的软件培训,职业培训, bootcamp没有任何关系。
我们也不是这样的一个软件培训,职业培训, bootcamp机构。 我们提供的学习
机会
是完全免费的。
如果你正在考虑下一个工作方向, 如果你正想成为一个软件工程师, 有许多时间可以
用来学习, 站内请联系我们。 我们能够提供机会帮助你成为一个软件工程师。
关于我们这个项目的说明:
我们是一家初创startup Internet software 公司, 这个项目为我们自己公司培养人
才。公司还在创业阶段,已有少量客户, 但收入很少,发不了工资, 但我们这个创业
团队对公司未来充满信心。 希望你可以用来学习工作的时间不少于一周至25小时,来我
们位于硅谷南湾的办公室工作。对于有意和我们共同长期把公司做成功的,
公司会发原始股。
我们主要开发Internet software for Enterprise Application, 用的语言是:
Python, Java, PHP, MySQL. (不要求你有相关语言和背景, 只要求你有强烈意愿学
习)。
技术工作主要做网站server端的开发 (包括, Python, Java, PHP, Django, etc),
也有客户端的开发。 客户端的开发包括
web front end 以及手机App和Facebook Apps.
详情, 请站内联系。
请给我们一个机会, 也给你自己一个机会。也许这就是你长久等待的一个机会。
(This opportunity is 仅仅限于硅谷南湾, 谢谢, Our office is on Walsh Ave,
Santa Clara. CA, 95050.
如果你不在硅谷南湾, 很对不起, 我们这个项目不合适你。)
如果您对这个项目不感兴趣, 请不要给别人泼冷水。
已经有多人从我们这个项目受益。
【在 s****y 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 多线程共同扫描,主线程在多线程中启动scan方法,每个线程都有 : 一个私有的list,每个线程共享一个“results”对象来向主线程报告进度, : 成功扫描次数必须精确。请改正和修改scan方法以提高任务性能。 : private interface Data { : public boolean scan(); : } : public void scan(List list, Properties results) { : synchronized (results) { : Iterator i = list.iterator(); : Object lock = new Object();
|
|