如果没有同步,一个线程的变化就不能被其他线程看到。同步不仅可以阻止一个线程看到对象处于不一致的状态之中,它还可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护的之前所有修改效果。
Java语言规范保证读写一个变量是原子的,除非这个变量为long或者是double。虽然语言规范保证了线程在读取原子数据的时候,不会看到任意的数值,但是它并不保证一个线程写入的值对于另一个线程将是可见的。 为了在线程之前进行可靠的通信,也为了互斥访问,同步是必要的。
package rule66;
import java.util.concurrent.TimeUnit;
public class StopThread {
private static boolean stopRequested;
public static void main(String[] args) throws InterruptedException {
Thread backgroudThread = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while(!stopRequested) {
i++;
}
}
});
backgroudThread.start();
TimeUnit.SECONDS.sleep(1);
stopRequested = true;
}
}
对上面的例子进行修改:
package rule66;
import java.util.concurrent.TimeUnit;
public class StopThread {
private static boolean stopRequested;
private static synchronized void requestStop() {
stopRequested = true;
}
private static synchronized boolean stopRequested() {
return stopRequested;
}
public static void main(String[] args) throws InterruptedException {
Thread backgroudThread = new Thread(new Runnable() {
@Override
public void run() {
int i = 0;
while(!stopRequested()) {
i++;
}
}
});
backgroudThread.start();
TimeUnit.SECONDS.sleep(1);
requestStop();
}
}
优化一下,更加节省开销:
在这里插入代码片



