语法:
synchronized (同步监视器){
// 需要被同步的代码;
}
说明:
- 操作共享数据的代码,即为需要被同步的代码
- 共享数据,多个线程操作的变量
- 同步监视器,俗称锁,任何一个对象都可以充当锁。
- 要求, 各个线程使用同一个锁对象
案例 Runnable:
class Window1 implements Runnable{
private int ticket = 100;
@Override
public void run() {
while(true){
synchronized (this){
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + ticket);
ticket--;
} else {
break;
}
}
}
}
}
public class WindowTest1 {
public static void main(String[] args) {
Window1 w = new Window1();
Thread t1 = new Thread(w);
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
案例 Thread:
class Window2 extends Thread{
private static int ticket = 100;
@Override
public void run() {
while(true){
//正确的
synchronized (Window2.class){//Class clazz = Window2.class,Window2.class只会加载一次
if(ticket > 0){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(getName() + ":卖票,票号为:" + ticket);
ticket--;
}else{
break;
}
}
}
}
}
public class WindowTest2 {
public static void main(String[] args) {
Window2 t1 = new Window2();
Window2 t2 = new Window2();
Window2 t3 = new Window2();
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
参考
1 尚硅谷