小编Sta*_*ura的帖子

鉴于jdk1.6及更高版本中的HashMaps会导致multi = threading问题,我应该如何修复我的代码

我最近在stackoverflow中提出了一个问题,然后找到答案.最初的问题是除了互斥锁或垃圾收集之外的什么机制可以减缓我的多线程java程序?

我惊恐地发现HashMap已经在JDK1.6和JDK1.7之间进行了修改.它现在有一个代码块,可以使创建HashMaps的所有线程同步.

JDK1.7.0_10中的代码行是

 /**A randomizing value associated with this instance that is applied to hash code of  keys to make hash collisions harder to find.     */
transient final int hashSeed = sun.misc.Hashing.randomHashSeed(this);
Run Code Online (Sandbox Code Playgroud)

最终打电话给谁

 protected int next(int bits) {
    long oldseed, nextseed;
    AtomicLong seed = this.seed;
    do {
        oldseed = seed.get();
        nextseed = (oldseed * multiplier + addend) & mask;
    } while (!seed.compareAndSet(oldseed, nextseed));
    return (int)(nextseed >>> (48 - bits));
 }    
Run Code Online (Sandbox Code Playgroud)

查看其他JDK,我发现JDK1.5.0_22或JDK1.6.0_26中不存在这种情况.

对我的代码的影响是巨大的.它使得当我在64个线程上运行时,我获得的性能低于在1个线程上运行时的性能.一个JStack显示大多数线程花费大部分时间在Random循环中旋转.

所以我似乎有一些选择:

  • 重写我的代码,以便我不使用HashMap,但使用类似的东西
  • 不知何故搞乱了rt.jar,并替换其中的hashmap
  • 以某种方式与类路径混淆,因此每个线程都有自己的HashMap版本

在我开始使用这些路径之前(所有这些路径看起来非常耗时并且可能产生很大影响),我想知道我是否错过了一个明显的技巧.任何人堆叠溢出的人都可以建议哪条路更好,或者找出新想法.

谢谢您的帮助

java collections performance multithreading

83
推荐指数
3
解决办法
9598
查看次数

Apache重启导致DocumentRoot必须是一个目录,即使它是一个目录,似乎没有特权问题

我几乎可以肯定是一个新手问题.我希望在写这个问题时能找到问题,但我仍然陷入困境.

我想更改Apache的DocumentRoot,但我不断收到错误消息"DocumentRoot必须是一个目录".

情况:

  • 代码在虚拟VMWare机器4.0.4 build-744019中运行
  • linux版本是Scientific Linux发行版6.4(Carbon)
  • apache的版本是Apache/2.2.15(Unix)(这是一个没有什么特别的yum安装)

在httpd.conf中

DocumentRoot "/home/stave/www"
Run Code Online (Sandbox Code Playgroud)

当我重新启动时,我收到消息

Starting httpd: Syntax error on line 292 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
Run Code Online (Sandbox Code Playgroud)

迄今采取的步骤:

我确保目录存在:

ls -asl /home/stave
4 drwxrwxrwx.  2 stave stave    4096 Feb  9 09:08 www
It even has a file in it "index.html", so I am very sure that the directory exists
Run Code Online (Sandbox Code Playgroud)

我认为它可能是一个特权问题(这是一个与互联网隔离的虚拟开发机器,我正在排除故障,因此我不太担心安全性),因为你可以看到我将特权设置为777.

我甚至更改了apache正在运行的用户(并确认该更改与ps一起工作)以保证特权不应成为问题.

堆栈溢出

有一些堆栈溢出答案,但大多数人说"读取错误消息.它说该目录实际上并不存在".其他人暗示最后可能会有一个尾随的斜线,这将是糟糕的.

其他网站

我发现的最有用的是这个被通知

你可能得到"Doc​​umentRoot必须是一个目录"错误,即使它实际上是一个目录,因为SELinux扩展.运行system-config-securitylevel(或redhat-c​​onfig-securitylevel)以禁用httpd的SELinux或为该目录授予SELinux权限:chcon -R -h -t httpd_sys_content_t/path/to/directory*

我的linux版本不是安全增强型Linux,所以不理解我还是尝试了它:没有效果.

现在的情况

我已经没有想法尝试,所以任何诊断问题或建议将不胜感激

apache apache2

26
推荐指数
4
解决办法
4万
查看次数

除了互斥锁或垃圾收集之外的哪些机制可以减慢我的多线程java程序?

问题

我有一段java代码(相关的JDK 1.6.0._22),它实现了无状态,无副作用的自由函数,没有互斥体.然而它确实使用了大量内存(我不知道这是否相关).

在过去,我访问过Sun Laboratories并收集了标准的"性能与线程数"曲线.由于此函数没有互斥锁,因此它有一个很好的图形,尽管随着线程数量的增加垃圾收集也开始了.经过一些垃圾收集调整后,我能够使这条曲线几乎平坦.

我现在在英特尔硬件上做同样的实验.硬件有4个CPU,每个CPU有8个内核和超线程.这给出了64个availableProcessors().不幸的是,"性能与线程数"的曲线很好地适用于1,2,3线程和3线程的大写.在3个线程之后,我可以根据需要添加任意数量的线程,并且性能不会更好

尝试解决问题

我的第一个想法是我曾经愚蠢并在某处引入了一些同步代码.通常要解决此问题,我运行JConsole或JVisualVM,并查看线程堆栈跟踪.如果我有64个线程以3的速度运行,我预计其中有61个会等待进入互斥锁.我没有找到这个.相反,我发现所有线程都在运行:非常慢.

第二个想法是,时间框架可能引入了问题.我用一个虚拟函数替换了我的函数,使用AtomicLong计算到十亿.这与线程数量相当精确:使用64个线程比使用1个线程,我能够快速计算到10亿次,高出64倍.

我认为(绝望开始)也许垃圾收集花了很长时间,所以我调整了垃圾收集参数.虽然这改善了我的延迟变化,但它对吞吐量没有影响:我仍然有64个线程以我期望3运行的速度运行.

我已经下载了英特尔工具VTunes,但我的技巧很弱:它是一个复杂的工具,我还不明白.我订购了说明书:给自己一个有趣的圣诞礼物,但是现在有点太晚了,无法解决我当前的问题

  1. 我可以用什么工具(精神或软件)来提高我对正在发生的事情的理解?
  2. 除了互斥锁或垃圾收集之外的哪些机制可能会减慢我的代码速度?

java performance multithreading garbage-collection

17
推荐指数
2
解决办法
673
查看次数

如何获取scala宏来替换方法调用

如何让scala宏替换方法调用?

我的目标是创造一个叫做的特质ToStringAdder.假设我有一个x具有此特征的对象,那么当我调用时,x.add(any)我希望宏实际调用x.add(any, string)字符串是AST的字符串表示形式.(tostring当''任何'是一个函数时,这样我就可以很好).

除了Expecty之外,我所看到的所有这些示例都是有效地使用静态方法调用:不使用调用宏的对象.Expecty有以下方法,它给我一个关于如何检测'隐含这个'的线索,但我找不到在reify调用中引用它的方法.

 private[this] def recordAllValues(expr: Tree): Tree = expr match {
    case New(_) => expr // only record after ctor call
    case Literal(_) => expr // don't record
    // don't record value of implicit "this" added by compiler; couldn't find a better way to detect implicit "this" than via point
    case …
Run Code Online (Sandbox Code Playgroud)

scala scala-macros

8
推荐指数
1
解决办法
1815
查看次数

scala中的构造函数与varargs

我是斯卡拉新手.我已经浏览了几本书,并阅读了一些在线教程.我的第一个项目遇到了问题,因此我将代码简化为最简单的问题.

我搜索了谷歌和堆栈溢出scala/constructors/varargs,并阅读了几个scala之旅.

(几乎)最简单的代码是:

class Foo(val params: Int*)
case class Foo1(val p: Int) extends Foo(p)
case class Foo2(val p1: Int, val p2: Int) extends Foo(p1, p2)

object Demo extends App {
  override def main(args: Array[String]) {
    val f = Foo2(1, 2)
    f.p1
  }
}
Run Code Online (Sandbox Code Playgroud)

访问p1时发生异常,是

线程"main"中的异常java.lang.ClassCastException:scala.collection.mutable.WrappedArray $ ofInt无法强制转换为java.lang.Integer

使用eclipse进行调试时,我发现了一个有趣的属性:查看变量时

f   Foo2  (id=23)   
    p2  2   
    params  WrappedArray$ofInt  (id=33) 
        array    (id=81)    
            [0] 1   
            [1] 2   
Run Code Online (Sandbox Code Playgroud)

那么p1发生了什么?

我很抱歉用新手问题困扰你

constructor scala variadic-functions

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

如何通过浏览器从 .tar.gz 文件(存储在云中)中提取数据

问题

我正在制作一个单页应用程序,它将其数据存储在主要云提供商的 blob 存储之一(例如 goggle 云存储)中。云存储中的数据是一个 .tar.gz 文件,我想从浏览器应用程序访问它。

tar 文件内有数百个文件,我只想获取其中一个文件并将其呈现为 HTML。我已经可以加载该文件,这只是“如何从中获取数据”。

毫不奇怪,我目前在单页应用程序中使用 typescript/javascript,但如果答案是“这样做”,情况可能会改变。

I'm not worried about browser compatibility (I can specify things like 'only works in this browser), but the browser doesn't have access to a file system and I can't 'shell out' to the operating system

What I have tried

I've had a look for npm packages, and the closest I've come to is https://github.com/npm/node-tar (but that seems to need a file system). I am reasonably confident working …

javascript tar single-page-application

4
推荐指数
1
解决办法
4453
查看次数