synchronized在for循环内外的区别

上一次说到,synchronized锁定普通方法静态方法和锁定代码块的this与class区别,

这一次说说synchronized在for循环内外的区别

synchronized在for循环的内部时:

@Override
public void run() {
for (int i = 0; i < 5; i++) {
synchronized (TestRunnable.class) {
System.out.println("线程:" + Thread.currentThread().getName() + "执行第" + i + "次");
}
}
}

输出:

线程:线程一执行第0次
线程:线程二执行第0次
线程:线程二执行第1次
线程:线程二执行第2次
线程:线程二执行第3次
线程:线程二执行第4次
线程:线程一执行第1次
线程:线程一执行第2次
线程:线程一执行第3次
线程:线程一执行第4次

synchronized在for循环的外部时:

public void run() {
synchronized (TestRunnable.class) {
for (int i = 0; i < 5; i++) {
System.out.println("线程:" + Thread.currentThread().getName() + "执行第" + i + "次");
}
}
}

输出:

线程:线程一执行第0次
线程:线程一执行第1次
线程:线程一执行第2次
线程:线程一执行第3次
线程:线程一执行第4次
线程:线程二执行第0次
线程:线程二执行第1次
线程:线程二执行第2次
线程:线程二执行第3次
线程:线程二执行第4次

结论:

同步符在外部时,执行结果必须是一个线程执行完了才能执行以下个,因为其他线程进不来。反之,一个线程就算进入了for循环,在循环若干次以后,可能会轮到其他的线程来执行,再回到初始线程时,依然能够继续执行之前的循环次数执行。(说了等于没说,很简单的结论,哈哈哈哈哈哈哈哈哈,记录一下

posted @ 2020-07-08 19:51  菲菲一个  阅读(1546)  评论(0编辑  收藏  举报