也就是说当线程运行到这个方法的时候,就开始检查有没有其他线程正在使用这个方法,有的话就等待其他线程运行完毕,没有的话就自己运行(好像很绅士的样子,你先上,你请,最后在自己上)。笔者在想,当我看到有票慌忙填数据提交完买票之后,浏览器开始刷新,刷了一小会之后告诉我“票已经卖空了”,应该就是synchronized的锅吧。
    修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁
    修饰静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁
    修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。
     这里只是一个简单的售票原理。真实情况肯定不会这么的简单,但简单又可以罗列出复杂。    package com.css.java.learning.ticket;
    /**
     * 探究火车票的售卖原理
     * @author Red_Ant
     * 20180928
     */
    public class SaleTrainTicket {
        private int totalCount = 1000;//通过什么途径获得的数据,笔者不管。反正就1000张票。
        //卖票
        public synchronized int SaleTicket(int num) {
            totalCount = totalCount - num;
            return totalCount;
        }
        //退票
        public synchronized int RebackTicket(int num) {
            if(totalCount < 0) {
                totalCount = 0;
            }
            totalCount = totalCount + num;
            return totalCount;
        }
    }SaleTrainTicket manager = new SaleTrainTicket();
        new Thread(new Runnable() {
            @Override
            public void run() {
                int leaveNum = manager.SaleTicket(2);
                if(leaveNum <= 0) {
                    System.err.println("呵呵,已经没票了");;
                }else {
                    System.err.println("还有" + leaveNum + "张票");
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                int num = manager.RebackTicket(1);
                System.err.println("退票之后,还有" + num + "张");
            }
        }).start();
    }【后话】
像数据共享这块,肯定不是笔者这样的简单操作。得是共享数据库数据吧!
我想原理差不多就这样吧。

原文:http://blog.51cto.com/13479739/2287374