essay | tech | year-summary | about
日期:2017-07-13T00:00:00Z
缘由是看知乎的一个答案,
里面写到同期的部分愣是没看懂.
由于我自己也没写过需要同期的东西.
就参照几个东西边看边研究.
IBM doc Javaの理論と実践: volatile を扱う
oracle doc Synchronized Methods
首先是关于sleep(),根本就没搞清楚他是什么意思.
(完全没有搞懂它内部是如何实现的)
自己动手丰衣足食,自己来尝试一下吧.
假设有A,B两个class.
同时call(1 step的时间差忽略不计)
因为sleep是static method.
那么我想知道,
如果class A每2秒count一次,
class B每3秒count一次.
那么是否会出现,
| time(s) | output A | output B |
|---|---|---|
| 0 | / | / |
| 1 | / | / |
| 2 | 1 | / |
| 3 | / | 1 |
| 4 | 2 | / |
| 5 | / | / |
| 6 | 3 | 3 |
| 7 | / | / |
的情况.( "/" 代表不输出数值)
Main.java
public class Main{
public static void main(String args[]){
TestThread a = new TestThread("class a", 2000);
TestThread b = new TestThread("class b", 3000);
a.start();
b.start();
}
}
TestThread.java
public class TestThread extends Thread {
private String name;
private long sleepTime;
private long time;
public TestThread (String name, long sleepTime){
this.name = name;
assert(sleepTime >= 0);
this.sleepTime = sleepTime;
}
public void run(){
this.time = System.currentTimeMillis();
for (int i = 0; i < 3; ++i){
try{
sleep(sleepTime);
}
catch (InterruptedException e){
}
System.out.println(name + " : " + i + " " +
(System.currentTimeMillis() - time)/1000 + "[s]");
}
}
}
%time java Main
class a : 0 2[s]
class b : 0 3[s]
class a : 1 4[s]
class b : 1 6[s]
class a : 2 6[s]
class b : 2 9[s]
java Main 0.11s user 0.22s system 3% cpu 9.315 total
解决了sleep()的疑问,但是带来了新的问题.
这里的currentTimeMillis()到底是怎样的机制?
如何才能正确的测量时间?
下个探索的阅读材料集锦