小编mkr*_*hin的帖子

为什么要将String编译切换为两个开关

我在编译开关时阅读了JVM规范,并对如何编译String上的switch语句感兴趣.这是我检查的测试方法(JDK1.7.0_40):

static int test(String i) {
    switch (i) {
        case "a":  return  -100;
        case "45b":  return  1;
        case "c":  return  2;
        default: return -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这个方法能够在string的hashCode上编译成简单的lookupswitch,但突然之间

static int test(java.lang.String);
Code:
   0: aload_0
   1: astore_1
   2: iconst_m1
   3: istore_2
   4: aload_1
   5: invokevirtual #6         // Method java/lang/String.hashCode:()I
   8: lookupswitch  { // 3
                97: 44
                99: 72
             51713: 58
           default: 83
      }
  44: aload_1
  45: ldc           #7 // String a
  47: invokevirtual #8 // Method java/lang/String.equals:(Ljava/lang/Object;)Z
  50: ifeq          83 …
Run Code Online (Sandbox Code Playgroud)

java jvm bytecode switch-statement java-7

20
推荐指数
1
解决办法
850
查看次数

如何保证ConcurrentHashMap的get()始终返回最新的实际值?

简介
假设我有一个ConcurrentHashMap单例:

public class RecordsMapSingleton {

    private static final ConcurrentHashMap<String,Record> payments = new ConcurrentHashMap<>();

    public static ConcurrentHashMap<String, Record> getInstance() {
        return payments;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后我有来自不同来源的三个后续请求(全部由不同线程处理).
第一个服务发出请求,获取单例,创建Record实例,生成唯一ID并将其放入Map,然后将此ID发送到另一个服务.
然后第二个服务使用该ID发出另一个请求.它获取单例,查找Record实例并修改它.
最后(可能在半小时后)第二个服务发出另一个请求,以便Record进一步修改.

问题
在一些非常罕见的情况下,我遇到了 heisenbug.在日志中我可以看到,第一个请求成功放置RecordMap,第二个请求发现它的ID,并修改它,然后第三个请求,试图找到ID记录,但一无所获(get()返回null).
我发现有关ConcurrentHashMap担保的一件事是:

在将对象放入任何并发集合之前的线程中的操作发生在从另一个线程中的集合访问或移除该元素之后的操作之前.

这里开始.如果我做对了,它的字面意思是,它get()可以返回实际上某个时间到Map的任何值,只要它不会破坏happens-before不同线程中的动作之间的关系.
在我的情况下,它适用于这样:如果第三个请求不关心在处理第一个和第二个期间发生的事情,那么它可以null从中读取Map.

它不适合我,因为我真的需要从Map最新的实际中得到Record.

我尝试过什么
所以我开始思考,如何形成happens-before后续Map修改之间的关系; 并有想法.JLS (在17.4.4)认为: …

java concurrency multithreading volatile concurrenthashmap

10
推荐指数
1
解决办法
794
查看次数

用ui-sref解析ui-router状态下的对象

在Angular控制器和ui-sref链接中拥有非常大的JSON对象我希望将此对象传递给将在ui-view中的模板控制器.
我知道,我可以使用ui-sref将参数传递给state,但我不希望这个对象出现在地址栏中.另外,我知道我们可以在状态中使用'resolve'选项,但我找不到如何从链接传递数据到'resolve'功能.

更新
如果我使用$ state.go:
路由器配置

state('social.feed.detailed',
     url: '/:activityID'
     templateUrl: 'views/social/detailedactivity.html'
)
Run Code Online (Sandbox Code Playgroud)

在模板中

<ums-social-activity ng-repeat="record in SOC_FEED_CTRL.records"
     activity="record"
     ui-sref-active="selected"
     ng-click="SOC_FEED_CTRL.goToDetailed(record)">
</ums-social-activity>
Run Code Online (Sandbox Code Playgroud)

在控制器中

$scope.SOC_FEED_CTRL.goToDetailed = (activity) ->
     # here activity is real object
     $state.go('social.feed.detailed', {'activityID':activity.id, 'activity':activity})
Run Code Online (Sandbox Code Playgroud)

然后'活动'参数根本没有解决.
更新2
如果我将路由配置修改为:

state('social.feed.detailed',
    url: '/:activityID?activity'
    templateUrl: 'views/social/detailedactivity.html'
)
Run Code Online (Sandbox Code Playgroud)

然后活动是字符串"[object Object]"

javascript angularjs angular-ui-router

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

JLS中final-field-safe上下文的确切含义是什么?

JLS第17.5.3段(最终字段的后续修改)经常使用术语最终字段安全上下文.虽然,从规范中可以理解(如果我在这里错了,请纠正我)

An implementation may provide a way to execute a block of code
in a final-fieldsafe context.
Run Code Online (Sandbox Code Playgroud)

确切的行为取决于实现,仍然没有明确的术语定义.
我可以假设,如果我们有一个最终字段冻结F(一个发生在对象构造的末尾或通过反射API设置的最终字段)和一个动作A,那么发生在之前(F,A ),那么A是在最终现场安全的背景下

java final jls

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

SVG 矩形继承父级的宽度和高度

简而言之,我拥有的是这样的 SVG 标记

\n\n
<svg width="700" height="700">\n    <g width="700" height="700">\n        <g width="66" height="140" class="bar"></g>\n        <g width="132" height="140" class="bar"></g>\n        <g width="99" height="140" class="bar"></g>\n    </g>\n</svg>\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在我想将 SVG 矩形放置在每个条形内。这些矩形应填充其相应的育儿栏。我检查了矩形的规范,发现当我们使用宽度作为属性时允许使用百分比单位,但它们可能有两种可能的含义:
\n1。视口百分比;
\n2. 边界框的百分比。
\n只要我设置了条组的宽度和高度,它应该对我有用。但是当我将 rect 元素的宽度设置为 100% 时,它不会 \xe2\x80\x94 ,它会占据整个 SVG 框。

\n

html svg

3
推荐指数
1
解决办法
4836
查看次数

当文件超出范围时,文件句柄如何关闭?

我不明白Rust在超出范围时对文件句柄的作用.例如,我创建一个文件并在其中写入几个单词:

let wd = os::getcwd().unwrap_or(Path::new("/"));
let mut file = File::create(&Path::new("daemon_log.txt"));
file.write_all(format!("DAEMON CWD: {}", wd.as_str().unwrap_or("some problems")).as_bytes());
Run Code Online (Sandbox Code Playgroud)

在文件超出范围时,编译器应插入释放内存的指令.如果我对通常实现阻塞IO的理解是正确的,那么除了释放内存之外,该进程还应该释放一些锁.

我担心的是,在源代码中File,我找不到编译器的任何提示.这老文章说,所有的魔法进入实施的Drop特点为File,但似乎这不是真的,现在,因为我无法找到Drop在任何特质的实施std::ops.rs也不在std::old_io::fs.rs.

UPDATE

我再次检查了Files的实现,write_all发现该write方法适用于一些descriptor(FileDesc).我没有在docs中找到任何关于它的相关信息,所以去了GitHub并找到了这个.它看起来像我的问题的答案,但我对评论中的一行感到困惑:

//关闭stdio文件句柄毫无意义,所以永远不要这样做

这是什么意思?我libc::close自己永远不应该对自己的fd进行调用?或者他们自己不确定应该如何实施?

io rust

3
推荐指数
1
解决办法
343
查看次数

在ngForm中的“输入”按键上触发某些按钮

摘自ngForm上的AngularJS文档:
“如果表单具有一个或多个输入字段以及一个或多个按钮或input [type = submit],则在任何输入字段中按Enter都会触发第一个按钮或input [type上的点击处理程序= submit](ngClick)和封闭表单(ngSubmit)上的提交处理程序”
问题:
有什么方法可以触发某些按钮,而不是“ first”?

javascript angularjs angularjs-ng-form

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