synchronized 关键字提供了一种锁机制,能够确保共享变量互斥访问,从而防止数据不一致问题的出现。
synchronized 关键字包括 monitor enter 和 monitor exit 两个 JVM 指令,它能够保证在任何时候任何线程执行到 monitor enter 成功之前必须从主内存中获取数据,而不是从缓存中,在 monitor exit 运行成功之后,共享变量被更新后的值必须刷入主内存。
synchronized 的指令严格遵守 java happens-before 规则,一个 monitor exit 指令之前必定有一个 mnitor enter。
synchronized 可对代码块或方法进行修饰,而不能对 class 以及变量进行修饰。
public synchronized void sync(){
......
}
public synchronized static void staticSync(){
......
}
private final Object MUTEX = new Object();
public void sync(){
synchronized(MUTEX){
......
}
}
package concurrent;
public class TicketWindowRunnable1 implements Runnable {
private int index = 1;
private final static int MAX = 50;
private final static Object MUTEX = new Object();
@Override
public void run() {
synchronized (MUTEX) {
while (index <= MAX) {
System.out.println(Thread.currentThread() + "的号码是:" + (index++));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) {
final TicketWindowRunnable1 task = new TicketWindowRunnable1();
Thread windowThread1 = new Thread(task, "1号窗口");
Thread windowThread2 = new Thread(task, "2号窗口");
Thread windowThread3 = new Thread(task, "3号窗口");
Thread windowThread4 = new Thread(task, "4号窗口");
windowThread1.start();
windowThread2.start();
windowThread3.start();
windowThread4.start();
}
}
上面程序无论运行多少次,都不会出现数据不一致问题。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/chengqiuming/article/details/123192607
内容来源于网络,如有侵权,请联系作者删除!