线程同步synchronized锁

package d1202;

public class AccountRunnerble implements Runnable {

    private final Account account = new Account();

    private int withDrawCount = 0;

    public AccountRunnerble(int count){
        withDrawCount = count;
    }

    @Override
    public void run() {
        /**
         * 形成的同步的解决方案1:同步代码块
         *      总结1:认识同步监视器(锁):
         *          synchronized(同步监视器){}
         *          1.必须引用数据类型,不能是基本类型
         *          2.在同步代码块中可以改变监视器对象的值,不能改变引用
         *          3.尽量不要String和包装Integer做同步监视器,如果使用了,只要保证代码块中不对器进行任何操作也可以
         *          4.一般使用共享资源做同步监视器,没有任何业务含义
         *          5.也可以创建一个没有任何含义的同步监视器(ex: Object object = new Object())
         *          6.建议使用final修饰同步监视器
         */

        /**
         * 总结:同步代码块的执行过程
         *  1.A线程来到同步代码块,发现同步监视器open状态,需要close(进入后close),然后执行其中的代码
         *  2.A线程执行过程中,发生了线程切换(阻塞,就绪),A线程失去了CPU,但是没有开锁open(此时同步锁是close状态,其它线程不能进入同步代码块)
         *  3.B线程获取CPU,来到执行同步代码块,发现同步监视器是close状态,则无法执行其中代码,B线程也进入阻塞状态
         *  4.A线程获取CPU后,执行后续代码,不同代码块执行完毕,释放锁open(此时同步锁是open状态)
         *  5.B线程获取CPU后,来到同步锁,此时锁是open状态,进入同步代码块,需要close(如同A线程的实行流程)
         */
            synchronized (account){
            if(account.getMoney()-withDrawCount>0){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                account.withDraw(withDrawCount);
                System.out.println(Thread.currentThread().getName()+"取款成功,当前余额:"+account.getMoney());
            }else {
                System.out.println(Thread.currentThread().getName()+"余额不足,当前余额:"+account.getMoney());
            }
        }
    }
}
发布了9 篇原创文章 · 获赞 0 · 访问量 212

猜你喜欢

转载自blog.csdn.net/mlh532354163/article/details/103342024