Synchronized简单介绍
- (1)有序性
有序性是指程序的执行顺序是按照看见的代码的从上到下的顺序执行的;产生这个问题的原因是因为重排序的原因,但是重排序在单机情况下,一般不会影响程序的执行,但是在多线程的并发的情况下,就会影响到程序的执行的正确性;但是Synchronized是对一块代码快进行了加锁,保证了,在同一时间只能有一个线程去执行改加锁的代码块,固而可以保证有序性;
- (2)原子性
public class SynchronizedTest {
private int count = 0;
public static void main(String[] args) {
SynchronizedTest test = new SynchronizedTest();
for (int i = 0; i <= 100; i++) {
new Thread(test::increase).start();
}
System.out.println(test.count);
}
public synchronized void increase() {
for (int i = 0; i < 100; i++) {
count ++;
}
}
}
以上小程序无论运行多少遍,输出的结果都是10000,可见synchronized可以保证原子性;
- (3)保证可见性
public class SynchronizedTest {
private static boolean flag = true;
public static void main(String[] args) throws InterruptedException {
new Thread(new Runnable() {
@Override
public void run() {
while (flag) {
synchronized (SynchronizedTest.class) {
}
}
System.out.println("线程1结束end");
}
}).start();
TimeUnit.SECONDS.sleep(2);
new Thread(() -> {
if (flag) {
System.out.println("线程2修改flag的值为false");
flag = false;
}
}).start();
}
}
以上小程序,最后会输出"线程1结束end"结束,可见synchronized可以保证可见性;