JAVA多线程——同步监视器,同步代码块,同步方法,synchronized关键字,解决多线程同步安全问题
synchronized关键字
同步监视器用来解决多线程发生数据错乱的问题
在一个线程操作数据时,其他线程无法同时操作同一数据
同步监视器只能是对象
并且推荐使用共享资源的对象
可以是当前对象(this),也可以是其他对象
1、可以有两种方法,一种是同步代码块,即将多个线程需要访问的同一块代码用synchronized包围
这个代码模拟买票系统,synchronized包围的代码是多个买票窗口需要共同访问的代码,在一个用户购票时,其他用户无法访问代码,以此保证票数不会出现错误,这就是为什么平时购票时,看到有余票,但是已下单就没有的原因。
synchronized (this) {
//同步代码 块
if (ticket>0) {
//有票
try {
Thread.sleep(300); //模拟出票时间3秒
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在卖第"
+(ticket--)+"张票");
}
}
//这个代码模拟买票系统,synchronized包围的代码是多个买票窗口需要共同访问的代码
2、第二种方法是,将同步代码块提出来,新建一个同步方法,而后直接调用即可。
/** * 同步方法 */
private synchronized void saleTicket() {
// TODO 自动生成的方法存根
if (ticket>0) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"正在卖第"
+(ticket--)+"张票");
}
}