小编Mor*_*rty的帖子

Java 6与Java 7之间自动拆箱的差异

我注意到Java SE 6和Java SE 7之间的自动拆箱行为有所不同.我想知道为什么会这样,因为我找不到这两个版本之间这种行为的变化的任何文档.

这是一个简单的例子:

Object[] objs = new Object[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Run Code Online (Sandbox Code Playgroud)

这与Java SE 7中的javac编译良好.但是,如果我给编译器"-source 1.6"参数,我在最后一行得到一个错误:

inconvertible types
found   : java.lang.Object
required: int
Run Code Online (Sandbox Code Playgroud)

我尝试下载Java SE 6以使用本机版本6编译器进行编译(不带任何-source选项).它同意并给出与上面相同的错误.

什么给出了什么?从一些更多的实验看来,Java 6中的拆箱似乎只能清楚地(在编译时)是盒装类型的unbox值.例如,这适用于两个版本:

Integer[] objs = new Integer[2];
objs[0] = new Integer(5);
int myInt = (int)objs[0];
Run Code Online (Sandbox Code Playgroud)

因此,似乎在Java 6和7之间,取消装箱功能得到了增强,因此它可以一次性抛出和取消对象类型,而不知道(在编译时)该值是正确的盒装类型.但是,通过阅读Java语言规范或Java 7发布时写的博客文章,我看不出有什么变化,所以我想知道改变是什么以及这个"功能"被称为什么?

好奇心:由于变化,可能会触发"错误"的拆箱:

Object[] objs = new Float[2];
objs[0] = new Float(5);
int myInt = (int)objs[0];
Run Code Online (Sandbox Code Playgroud)

这编译得很好但在运行时给出了ClassCastException.

对此有何提及?

java unboxing casting java-7

107
推荐指数
2
解决办法
8006
查看次数

Java:为什么主线程没有进展?

我遇到了一些多线程Java程序的问题,并将其简化为一个非常简单的例子 - 我的困惑仍然不少!

它的示例程序如下所示.那么这是做什么(或者打算做什么)?好吧,main()函数从一个简单的线程开始,基于一个静态的内部类Runnable.这个Runnable包含两个嵌套循环,它们对局部变量"z"进行简单计算,总计10 ^ 12次迭代(10 ^ 6*10 ^ 6),之后它将打印出结果并退出.产生这个工作线程后,主线程进入一个自己的循环,它将字符串"Z"打印到控制台,之后它休眠(使用Thread.sleep())1秒钟,然后反复重复.

所以运行这个程序,我希望它在计算线程正在完成它的工作时每1秒打印一次"Z".

然而,事实上发生的是计算线程启动,主线程显示第一个"Z",但没有任何反应.它似乎挂在Thread.sleep调用中,无论是无限的还是至少很多,比请求的1000毫秒长得多.

请注意,这是在具有多线程的快速四核机器上,因此同时运行线程应该没有问题.其他核心在Windows任务管理器中显示为空闲.此外,即使在单核系统上,我也希望操作系统定期抢占计算线程,以便允许主线程打印字符串.此外,线程之间没有共享变量或锁定,因此它们不应该相互阻塞.

更奇怪的是,它似乎对行为至关重要,Runnable中有两个嵌套循环.只需一个循环,迭代次数相同,一切都按预期工作.

我已经使用Java 1.8.0_73在Windows 10 64位上对此进行了测试.

有人可以解释这种行为吗?

public class Calculate {
    static class Calc implements Runnable
    {
        @Override
        public void run() {
            int z = 1;
            for(int i = 0; i < 1000000; i++) {      
                for(int j = 0; j < 1000000; j++) {
                    z = 3*z + 1;
                }               
            }
            System.out.println("Result: " + z);
        }
    }

    public static void main(String[] args)  throws Exception
    {
        Thread t = …
Run Code Online (Sandbox Code Playgroud)

java multithreading

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

Google 云端硬盘修订版未返回 Google 表格的所有修订版

我正在尝试编写一个脚本来分析对 Google Sheets 文档的更改。当我查看 Google Sheets 中的版本历史记录时,我看到似乎可以追溯到 2014 年的文档的完整历史记录。但是,当我尝试使用 Google Drive API(这是唯一一个似乎可以支持这一点,Google Sheets API 似乎不直接支持它?)我只得到了大约 5 年的 226 次修订。我已经实现了对使用 getNextPageToken() 进行迭代调用的支持,并且我确实得到了两个块(一个大小为 200,一个大小为 26),所以我认为这与此无关。似乎 API 真的只想在 226 次修订中呈现。使用 Google 的 API 资源管理器时,我得到了相同的结果。

https://issuetracker.google.com/issues/70101398

google-sheets google-drive-api google-sheets-api

7
推荐指数
0
解决办法
329
查看次数

Visual Studio 2015中的C ++ AMP:编译器/运行时错误还是错误示例?

我想尝试以下来自Microsoft文档的C ++ AMP代码示例:

https://msdn.microsoft.com/zh-cn/library/hh265136.aspx上的第二个代码示例,稍作修改即可将其转换为程序):

#include "stdafx.h"

#include <amp.h>
#include <iostream>
using namespace concurrency;

const int size = 5;

void CppAmpMethod() {
    int aCPP[] = { 1, 2, 3, 4, 5 };
    int bCPP[] = { 6, 7, 8, 9, 10 };
    int sumCPP[size];

    // Create C++ AMP objects.
    array_view<const int, 1> a(size, aCPP);
    array_view<const int, 1> b(size, bCPP);
    array_view<int, 1> sum(size, sumCPP);
    sum.discard_data();

    parallel_for_each(
        // Define the compute domain, which is the set of threads that are created. …
Run Code Online (Sandbox Code Playgroud)

c++-amp visual-studio-2015

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

使用错误的BIOS修改华硕Z170主板上的ia32功能控制寄存器

我处于不幸的情况,我需要使用CPU功能,在ia32功能控制MSR寄存器中没有启用BIOS.BIOS确实设置了锁定位,因此我无法自行设置该位.BIOS(华硕UEFI BIOS)无法更改行为.问题是,有什么方法可以设置这个位吗?我在想是否可以编写UEFI扩展或我可以从UEFI shell执行的某个程序.但是我不确定寄存器在执行之前是否被锁定(我对UEFI及其编程环境知之甚少).或者,是否可以修补BIOS更新映像或使用标准工具对其进行修改?谁听说过这个地区的成功商店?

有问题的功能是SGX(Software Guard Extensions).董事会是华硕Z170-K.除了BIOS无法设置此位外,一切都已到位以支持SGX.

5月22日更新:我刚刚将华硕Z170-K更新到新发布的BIOS 1803(5月20日发布).这是一个很大的版本号跳跃,所以我很有希望.可悲的是,新交所的支持仍然不存在.我现在已经向华硕提出了一项新的请求,这次我打算不要被刷掉.我认为它是彻头彻尾的业余,从一开始就不支持它 - 它是支持Skylake CPU的一部分,所以我认为所有需要这个的客户都应该尝试退款(我知道我会这样做).

bios uefi

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

与TSX相关的Skylake勘误表SKL-105的状态如何?

众所周知,英特尔不得不通过微代码更新来禁用Haswell系列处理器中的TSX.这是由于TSX实现中的一个错误,如果使用这些指令可能会产生错误的结果.

似乎不太为人所知的是,在新的架构Skylake上,显然还有一个影响TSX的勘误表.特别是这里提到的勘误表"SKL-105":

http://www.intel.com/content/www/us/en/processors/core/desktop-6th-gen-core-family-spec-update.html

它明确指出使用TSX会导致不可预测的系统行为.但是,它还指出BIOS可以进行修复.然而,问题是这个修复需要什么.是否像Haswell微码"修复"那样完全禁用TSX?谷歌搜索"SKL105"没有结果,所以社区似乎通常没有意识到它?

一些用户注意到TSX功能被"瘫痪"禁用(但似乎没有意识到上面的勘误表):

https://www.reddit.com/r/hardware/comments/44k218/intel_disables_tsx_transactional_memory_again_in/

奇怪的是,如果只有某些CPU的变体受到影响,因为人们会认为它们都会共享相同的微体系结构,因此同样会受到这个bug的影响.

顺便说一下,这样的微码"修复"的另一种方式可以操作,并且可能更隐蔽:我认为有可能进行仍然暴露TSX存在的微代码更新(使得它似乎仍然启用了功能)但是会覆盖新的TSX指令的实现,其中"虚拟实现"实际上永远不会忽略锁,实际上只是以老式的方式执行代码,从而避免了错误,但也提到了TSX可以提供的性能改进.确定是否发生这种情况的唯一方法是通过性能测量.

任何人都有关于Skylake TSX状态的更多信息?在任何情况下,奇怪的是,没有更多的信息被释放,人们必须猜测受影响的是什么,什么不是.事实上,如果该功能使用安全.

我有一个6700K,功能仍在那里.但这也取决于BIOS制造商是否采用了微码更新,而且我还没有实际测量性能,所以我不能排除它仍然可能已被禁用cf. 上一段.

hardware performance x86 intel tsx

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

iOS和Android上的受信任执行环境(TEE)

在金融科技领域,有很多关于可信执行环境(TEE)使用的讨论。我知道在iOS和Android上都可以使用一些密钥存储API来生成密钥并将其用于签名/解密。但是自己编写的代码正在作为普通应用程序运行。

我的问题是,这是TEE唯一可用的用途吗?还是普通的应用程序开发人员(即不是手机制造商等的开发人员)可以编写应用程序中的代码在TEE中运行的应用程序?我无法在Google或Apple上找到描述该操作方法的文档。是否有特殊的API?

android ios

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