Synchronized簡單介紹
- (1)有序性
有序性是指程序的執(zhí)行順序是按照看見的代碼的從上到下的順序執(zhí)行的;產(chǎn)生這個問題的原因是因為重排序的原因,但是重排序在單機情況下,一般不會影響程序的執(zhí)行,但是在多線程的并發(fā)的情況下,就會影響到程序的執(zhí)行的正確性;但是Synchronized是對一塊代碼快進行了加鎖,保證了,在同一時間只能有一個線程去執(zhí)行改加鎖的代碼塊,固而可以保證有序性;
- (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 ++;
}
}
}
以上小程序無論運行多少遍,輸出的結(jié)果都是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結(jié)束end");
}
}).start();
TimeUnit.SECONDS.sleep(2);
new Thread(() -> {
if (flag) {
System.out.println("線程2修改flag的值為false");
flag = false;
}
}).start();
}
}
以上小程序,最后會輸出"線程1結(jié)束end"結(jié)束,可見synchronized可以保證可見性;