线程不安全代码测试
private static class UnsafeSequence {
private int value;
public int getNext() {
return value++;
}
}
使用两个线程分别调用上面的getNext方法1000次,出现了一次线程不安全的情况,在转出的结果中有两个1311:
原因分析,与书上说的一致:
完整的代码
import java.io.PrintWriter;
import java.util.concurrent.CountDownLatch;
/**
* Created by luohao07 on 2018/1/2.
*/
public class UnsafeSequenceTest {
public static void main(String[] args) throws Exception{
UnsafeSequence unsafeSequence = new UnsafeSequence();
PrintWriter out = new PrintWriter("out.txt");
CountDownLatch countDownLatch = new CountDownLatch(2);
new Thread() {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
out.println(unsafeSequence.getNext() + " T1");
}
countDownLatch.countDown();
}
}.start();
new Thread() {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
out.println(unsafeSequence.getNext()+" T2");
}
countDownLatch.countDown();
}
}.start();
countDownLatch.await();
out.flush();
out.close();
}
private static class UnsafeSequence {
private int value;
public int getNext() {
return value++;
}
}
}
Timer执行定时任务
public class TimerTest {
public static void main(String[] args) {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("invoke....");
}
}, new Date(System.currentTimeMillis() + 5000));
}
}
程序启动后5秒输出invoke....