小编Yia*_*nis的帖子

Java中的并发和阻塞队列

我有一个线程将事件推送到第二个线程的传入队列的经典问题.只有这一次,我对表现很感兴趣.我想要实现的是:

  • 我希望并发访问队列,生产者推送,接收器弹出.
  • 当队列为空时,我希望使用者阻塞队列,等待生产者.

我的第一个想法是使用a LinkedBlockingQueue,但我很快意识到它不是并发的,而且性能受到了影响.在另一方面,我现在使用ConcurrentLinkedQueue,但还是我付出的成本wait()/ notify()每本出版物上.由于消费者在找到空队列时没有阻止,因此我必须同步并wait()锁定.另一方面,制作人必须获得锁定并notify()在每一个出版物上.总体结果是sycnhronized (lock) {lock.notify()},即使不需要,我也会支付每一份出版物的费用 .

我猜这里需要的是一个阻塞和并发的队列.我想象一个push()操作工作ConcurrentLinkedQueue,notify()当推送元素是列表中的第一个时,对象的额外内容.这种检查我认为已经存在ConcurrentLinkedQueue,因为推动需要连接下一个元素.因此,这比每次在外部锁上同步要快得多.

是这样的/合理的吗?

java queue concurrency blocking

27
推荐指数
3
解决办法
3万
查看次数

什么是最低Cross AppDomain通信性能损失?

我试图最小化在同一台机器上跨AppDomain进行通信的性能损失.在我的玩具示例中,A类在AppDomain 1中加载.它创建一个AppDomain 2并在那里加载一个Class 2实例(Class 2继承自MarshalByRef)获取代理.然后,Class 1重复调用代理上不返回任何值的方法.

我得到以下结果:

  1. 没有AppDomains,这两个类都加载在同一个AppDomain中,第一个调用是第二个方法(该方法没有参数):2400万个方法调用/秒
  2. 如上所述的两个AppDomain,方法没有参数或"出血"字符串参数:340.000方法调用/秒
  3. 如上所述的两个AppDomain,一个可序列化参数(两个字符串的数组):64.000个方法调用/秒

虽然我理解2和3之间的性能损失(序列化),但我真的不明白为什么从案例1到案例2的速度要慢100倍.据我所知,一旦创建了代理,所有后续的方法调用必须非常快,因为没有数据从一个AppDomain编组到另一个AppDomain.现在有人为什么要通过AppDomains进行通信这么慢?难道我做错了什么?

PS1.我对这个唯一的技巧是在这里:"与跨越一个AppDomain边界的成本是令人尴尬的." 我猜他指的是序列化......

PS2.我不计算AppDomain或代理创建时间(我的基准测试从第一个方法调用开始)

PS3.我在WinXP SP3机器上使用.NET 3.5.我也试过.NET 4.0 Beta 1没有显着差异.

c# performance appdomain

19
推荐指数
1
解决办法
4695
查看次数

从PHP数组读取时,[]的意思是什么?

我一直在为PHP写一个解析器,虽然搞乱了一些第三方代码,但我遇到了一个关于[]运算符的奇怪案例.

通常,[]在赋值的左侧没有键使用意味着"添加为最后一个元素".

$a = array();
$a[] = 1;
Run Code Online (Sandbox Code Playgroud)

将在数组$ a的末尾添加1.

在前面提到的代码中,我看到了这样的一行:

$r =& $a[];
Run Code Online (Sandbox Code Playgroud)

当我试图删除&时,我得到了一个相当预期的致命错误:

致命错误:无法使用[]进行阅读

随着&不过,PHP不会抱怨的.表达式的含义是什么?

& $a[];
Run Code Online (Sandbox Code Playgroud)

php

6
推荐指数
1
解决办法
1164
查看次数

标签 统计

appdomain ×1

blocking ×1

c# ×1

concurrency ×1

java ×1

performance ×1

php ×1

queue ×1