我创建了一个新的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.jar和mockito-all-1.9.5.jar定义org.hamcrest.Description.出于显而易见的原因,我必须包括Mockito罐子 - 我需要Mockito.Android提供了不同版本的JUnit,但它是一个不包含@RunWith注释的旧版本.
有人可以回答如何在Android项目中使用powermock和mockito,而不会出现冲突org.hamcrest.Description问题吗?
使用标准的Android WebViews WebView.loadUrl(String url, Map<String, String> additionalHttpHeaders).如何使用Chrome自定义标签添加其他标头?
这个问题仅涉及内存可见性,不会发生在之前和发生之后.Java中有四种方法可以保证一个线程中的内存更改对另一个线程可见.(参考http://gee.cs.oswego.edu/dl/cpj/jmm.html)
根据Java Concurrency in Practice,关于这些问题的圣经:
volatile变量的可见性效果超出了volatile变量本身的值.当线程甲写入到易失性可变,并随后线程乙读取相同的变量,的值的所有变量都是对可见光甲于写入所述易失性可变变得可见之前B看书挥发性变量之后.
这是否意味着JVM实际上跟踪了易失性变量读写,以便知道如何将内存从A刷新到B而不是A到C?所以A写入变量,后来C从变量读取,然后B从变量中读取,刷新是在A和B以及A和C之间以每线程完成的,而不是 B和C?或者,它是否暗示所有缓存的内存都被刷新,无论线程如何?是只刷新的volatile变量,还是所有缓存的内存?
对于synchronized关键字刷新,它表示只有锁内部更新的内存才能保证发布到其他线程.这意味着在下面的代码中,两个线程在运行method(),同步块将刷新staticVar2到另一个线程,但不是 staticVar1,这是正确的吗?
此外,如果另一个线程正在执行method2(),同步differentLock可以导致发生 - 在发生之前 - 发生问题method().但是,问题在于可见性.如果线程A执行method,那么后面的线程B执行method2() …
我在项目中经常看到这种类型的代码,其中应用程序需要全局数据持有者,因此它们使用任何线程都可以访问的静态单例.
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) 来自Intel 的 x86 手册,第 2 卷,第 3.1.1.2 节:指令汇总表中的操作码列(带有 VEX 前缀的指令)
NDS、NDD、DDS:指定 VEX.vvvv 字段对于寄存器操作数的编码有效:
- VEX.NDS:VEX.vvvv 以指令语法对第一个源寄存器进行编码,其中源寄存器的内容将被保留。
- VEX.NDD:VEX.vvvv 对 ModR/M:reg 字段无法编码的目标寄存器进行编码。
- VEX.DDS:VEX.vvvv 以三操作数指令语法对第二个源寄存器进行编码,其中第一个源寄存器的内容将被结果覆盖。
我认为这与“非破坏性来源”有关,我认为这就是 NDS 所代表的意思。其他代表什么?这如何影响指令的编码?同样,为什么它们很重要 - 因为据我所知,AMD 手册不包含任何对这些术语的参考?