小编Mat*_*ley的帖子

如何在Android项目中使用PowerMock?

我创建了一个新的Android测试项目.我从https://code.google.com/p/powermock/downloads/list下载了powermock-mockito-junit-1-1.5.zip .我将所有库添加到测试项目的libs文件夹中.测试类是一个非常简单的对象:

package com.test.test;

import org.junit.runner.RunWith;
import org.powermock.modules.junit4.PowerMockRunner;

import android.util.Log;

@RunWith(PowerMockRunner.class)
public class TestTestAndroid {

    public void testRuns() {
        Log.e("test", "Test case is called");
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我尝试从Eclipse运行项目,或从命令行生成项目.我犯了同样的错误:

Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/hamcrest/Description;

事实证明,无论是junit-4.8.2.jarmockito-all-1.9.5.jar定义org.hamcrest.Description.出于显而易见的原因,我必须包括Mockito罐子 - 我需要Mockito.Android提供了不同版本的JUnit,但它是一个不包含@RunWith注释的旧版本.

有人可以回答如何在Android项目中使用powermock和mockito,而不会出现冲突org.hamcrest.Description问题吗?

android mocking mockito powermock

13
推荐指数
2
解决办法
1万
查看次数

如何向Chrome自定义标签添加自定义HTTP标头?

使用标准的Android WebViews WebView.loadUrl(String url, Map<String, String> additionalHttpHeaders).如何使用Chrome自定义标签添加其他标头?

java android chrome-custom-tabs

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

使用volatile和synchronized时,刷新或发布到各种线程的内存范围是多少?

这个问题仅涉及内存可见性,不会发生在之前和发生之后.Java中有四种方法可以保证一个线程中的内存更改对另一个线程可见.(参考http://gee.cs.oswego.edu/dl/cpj/jmm.html)

  1. 写入线程释放同步锁,读取线程随后获取相同的同步锁.
  2. 如果一个字段被声明为volatile,那么在写入器线程执行任何进一步的内存操作之前,写入它的任何值都会被写入线程刷新并使其可见(即,为了手头的目的,它立即被刷新).
  3. 线程第一次访问对象的字段时,它会看到字段的初始值或自某个其他线程写入的值.
  4. 当一个线程终止时,所有写入的变量都被刷新到主存储器.

根据Java Concurrency in Practice,关于这些问题的圣经:

volatile变量的可见性效果超出了volatile变量本身的值.当线程写入到易失性可变,并随后线程读取相同的变量,的值的所有变量都是对可见光于写入所述易失性可变变得可见之前B看书挥发性变量之后.

挥发性的问题

这是否意味着JVM实际上跟踪了易失性变量读写,以便知道如何将内存从A刷新到B而不是AC?所以A写入变量,后来C从变量读取,然后B从变量中读取,刷新是在AB以及AC之间以每线程完成的,而不是 BC?或者,它是否暗示所有缓存的内存都被刷新,无论线程如何?是只刷新的volatile变量,还是所有缓存的内存?

同步问题

对于synchronized关键字刷新,它表示只有锁内部更新的内存才能保证发布到其他线程.这意味着在下面的代码中,两个线程在运行method(),同步块将刷新staticVar2到另一个线程,但不是 staticVar1,这是正确的吗?

此外,如果另一个线程正在执行method2(),同步differentLock可以导致发生 - 在发生之前 - 发生问题method().但是,问题在于可见性.如果线程A执行method,那么后面的线程B执行method2() …

java synchronization memory-model java-memory-model

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

在Java中静态单例中访问的变量的内存可见性是多少?

我在项目中经常看到这种类型的代码,其中应用程序需要全局数据持有者,因此它们使用任何线程都可以访问的静态单例.

public class GlobalData {

    // Data-related code. This could be anything; I've used a simple String.
    //
    private String someData;
    public String getData() { return someData; }
    public void setData(String data) { someData = data; }

    // Singleton code
    //
    private static GlobalData INSTANCE;
    private GlobalData() {}
    public synchronized GlobalData getInstance() { 
       if (INSTANCE == null) INSTANCE = new GlobalData();
       return INSTANCE; 
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望很容易看出发生了什么.GlobalData.getInstance().getData()任何时候都可以在任何线程上调用.如果两个线程使用不同的值调用setData(),即使你不能保证哪一个"获胜",我也不担心.

但线程安全不是我关心的问题.我担心的是内存可见性.只要Java中存在内存屏障,缓存的内存就会在相应的线程之间进行同步.通过同步,访问volatile变量等时会发生内存屏障.

想象一下以下场景按时间顺序发生:

// Thread 1
GlobalData d = GlobalData.getInstance();
d.setData("one");

// Thread …
Run Code Online (Sandbox Code Playgroud)

java java-memory-model

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

在编码 VEX 指令时,NDS、NDD 和 DDS 代表什么?

来自Intel 的 x86 手册,第 2 卷,第 3.1.1.2 节:指令汇总表中的操作码列(带有 VEX 前缀的指令)

NDSNDDDDS:指定 VEX.vvvv 字段对于寄存器操作数的编码有效:

  • VEX.NDS:VEX.vvvv 以指令语法对第一个源寄存器进行编码,其中源寄存器的内容将被保留。
  • VEX.NDD:VEX.vvvv 对 ModR/M:reg 字段无法编码的目标寄存器进行编码。
  • VEX.DDS:VEX.vvvv 以三操作数指令语法对第二个源寄存器进行编码,其中第一个源寄存器的内容将被结果覆盖。

我认为这与“非破坏性来源”有关,我认为这就是 NDS 所代表的意思。其他代表什么?这如何影响指令的编码?同样,为什么它们很重要 - 因为据我所知,AMD 手册不包含任何对这些术语的参考?

x86 assembly x86-64 intel machine-code

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