同步代码块:解决多线程操作同一个数据的问题,只要有一个线程进入同步代码块中执行代码,锁就会关闭,其它线程必须等待里面的线程执行完毕后才能进去。

格式

synchronized (任意锁对象) {

  操作共享数据的代码

}

//注意:synchronized中的锁对象必须是唯一的

好处:解决了多线程的数据安全问题

弊端:当线程较多时,每个线程都会判断同步上的锁,耗费资源,降低程序运行效率

复制代码
public static void main(String[] args) {
        MyRunnable mr = new MyRunnable();
        Thread t1 = new Thread(mr);
        Thread t2 = new Thread(mr);
        Thread t3 = new Thread(mr);
        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
复制代码
public class MyRunnable implements Runnable {

    private static int ticket = 100;
    private static Object obj = new Object();

    @Override
    public void run() {
        while (true) {
            synchronized (obj) {
                if (ticket <= 0) {
                    System.out.println("票卖完了");
                    break;
                }
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                ticket--;
                System.out.println(Thread.currentThread().getName() + "卖票了,还剩" + ticket + "张票");
            }
        }
    }
}
复制代码
复制代码