Java中synchronize关键字

Posted 时光spring

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中synchronize关键字相关的知识,希望对你有一定的参考价值。

初学java多线程,在用synchronize关键字修饰同步代码块时,运行代码发现不能交替卖票。 以下是初始代码

package com.itheima.Test;

public class Test1a {

    public static void main(String[] args) {
        Ticket1a t1=new Ticket1a();
        new Thread(t1,"A").start();
        new Thread(t1,"B").start();
        new Thread(t1,"C").start();
        
    }

}
class Ticket1a implements Runnable{
     int ticket=100;
    @Override
    public void run() {
        synchronized (Ticket1a.class) {                    
        while (true) {
            if (ticket<=0) {
                break;
            }
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                System.out.println(Thread.currentThread().getName()+"  sold   "+(ticket--));
        }
        }
    }
}

运行结果:

A  sold   100
A  sold   99
A  sold   98
A  sold   97
A  sold   96
A  sold   95
A  sold   94
A  sold   93
A  sold   92
A  sold   91
.
.
.
A  sold   10
A  sold   9
A  sold   8
A  sold   7
A  sold   6
A  sold   5
A  sold   4
A  sold   3
A  sold   2
A  sold   1

虽然解决了线程的安全问题,但是不能实现三个窗口交替卖票。后来仔细一看,是synchronize关键字修饰的代码块位置不对,相当于修饰了同步方法。

更改后:

    @Override
    public void run() {
        while (true) {
                synchronized (Ticket1a.class) {
            if (ticket<=0) {
                break;
            }
            try {
                Thread.sleep(20);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
                System.out.println(Thread.currentThread().getName()+"  sold   "+(ticket--));
          }
        }
    }        

这样就完成了线程安全的小测试。

代码布局实在太乱没来得及改......

以上是关于Java中synchronize关键字的主要内容,如果未能解决你的问题,请参考以下文章

Java中synchronize关键字

JAVA synchronized关键字锁机制(中)

java中synchronized关键字的用法

Java有了synchronized,为什么还要提供Lock

java线程总结--synchronized关键字,原理以及相关的锁

java synchronized关键字浅探