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--)+"张票");
 	 }
 }
全部评论

相关推荐

不愿透露姓名的神秘牛友
2024-12-18 15:35
程序员牛肉:完全是在胡写简历。 我很好奇你干嘛要在教育经历里面写你是软件二班的班长?你写它的目的是什么?我觉得真的就是很突兀。给我第一感觉就是:你真的是一个心智健全的成年人吗? 另外我也很好奇你是怎么做到参加了这么多所谓的计算机比赛,完事儿一个拿得出手的项目都没有。 自己的项目经历还是图书馆管理系统这种垃圾东西……我的的建议是你都不如大幅度删减一下自己的水奖项,看着真的给人一种又水又学傻了的感觉。 计算机不看奖项,看院校和个人能力。 计算机是强工科,你要投后端的你就应该明白,人家招你进去是指望你干活儿的。那你觉得你这份简历有展示出你的后端水平吗? 你动动你的脑子想一想,人家面试官要想通过你的简历看出你的项目开发能力,最重要的板块就是两个,第一个是你的实习,第二个是你的项目。你没有实习,是不是就应该在项目上好好琢磨琢磨? 你自己看看你项目写的什么描述,你作为一个要后端岗位的应届生,你对你自己项目的描述还仅仅停留在使用mySQL,使用JAVA,使用spring boot框架。给人一眼感觉就感觉完全就是你做的玩具。可能就是你哪一个学期做的课设。 对于应届生来讲,在项目板块要尽量突出自己的技术能力,因为谈业务你肯定也不懂。简单来讲,你的项目要清晰准确的表达:你用哪种技术解决了现有的哪种技术问题,带来了多少的效益提升? 所有关于项目的描述都围绕我说的这种表达方式去写。不要自己自嗨式的写一堆垃圾上去 你既没有实习项目,又没有一个比较好一点的项目,而且院校也比较差,所以找工作会异常的难找。
点赞 评论 收藏
分享
2024-11-25 20:48
门头沟学院 Java
北街旧亭:每次点都有点哈 一键发评里面带书籍图标的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务