指令级并行是什么
指令级并行(ILP)指通过通过流水线等技术实现多条指令同时并行执行的并行技术
实现ILP主要的方法有:
- 依靠硬件动态发现和开发并行
-
实例
引入pom
使用jcstress来进行大数据量测试<dependencies><dependency><groupId>org.openjdk.jcstress</groupId><artifactId>jcstress-core</artifactId><version>${jcstress.version}</version></dependency></dependencies><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><!--jcstress version to use with this project.--><jcstress.version>0.5</jcstress.version><!--Java source/target to use for compilation.--><javac.target>1.8</javac.target><!--Name of the test Uber-JAR to generate.--><uberjar.name>jcstress</uberjar.name></properties><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><compilerVersion>${javac.target}</compilerVersion><source>${javac.target}</source><target>${javac.target}</target></configuration></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>2.2</version><executions><execution><id>main</id><phase>package</phase><goals><goal>shade</goal></goals><configuration><finalName>${uberjar.name}</finalName><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><mainClass>org.openjdk.jcstress.Main</mainClass></transformer><transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/TestList</resource></transformer></transformers></configuration></execution></executions></plugin></plugins></build>
I_Result是结果集,ACCEPTABLE_INTERESTING是我们推测的最极端条件下产生的结果,也就是可见性
。 ```java import org.openjdk.jcstress.annotations.*; import org.openjdk.jcstress.infra.results.I_Result;
@JCStressTest @Outcome(id = {“1”, “4”}, expect = Expect.ACCEPTABLE, desc = “ok”) @Outcome(id = “0”, expect = Expect.ACCEPTABLE_INTERESTING, desc = “!!!!”) @State public class ConcurrencyTest {
int num = 0;boolean ready = false;@Actorpublic void actor1(I_Result r) {if(ready) {r.r1 = num + num;} else {r.r1 = 1;}}@Actorpublic void actor2(I_Result r) {num = 2;ready = true;}
}
打包后<br /><br />在CMD中输入 java -jar target/jcstress.jar -t cn.itcast.ConcurrencyTest<br />触发了58次这个可见性的结果<br /><a name="XQJNX"></a># 解决方案```javaimport org.openjdk.jcstress.annotations.*;import org.openjdk.jcstress.infra.results.I_Result;@JCStressTest@Outcome(id = {"1", "4"}, expect = Expect.ACCEPTABLE, desc = "ok")@Outcome(id = "0", expect = Expect.ACCEPTABLE_INTERESTING, desc = "!!!!")@Statepublic class ConcurrencyTest {int num = 0;volatile boolean ready = false;@Actorpublic void actor1(I_Result r) {if(ready) {r.r1 = num + num;} else {r.r1 = 1;}}@Actorpublic void actor2(I_Result r) {num = 2;ready = true;}}
重新运行后:
就没有出现可见性问题了。
