zoukankan      html  css  js  c++  java
  • java 22

    上一章说了,解决线程安全问题的实现方式1是使用同步代码块

    同时也知道了,同步代码块的锁对象是任意对象:(Object obj ;  Demo d;)这些都行

    那么,现在来说解决线程安全问题的实现方式2

    同步方法:(一个方法一进去就看到代码被同步了的情况下考虑使用)

      把同步关键字synchronized添加到方法上

    那么,同步方法的锁对象是什么呢?

      是this

    如果这个同步方法是静态方法,那么这个静态同步方法的锁对象是什么呢?

      是类的字节码文件对象(反射中会讲解)

      现在演示的例子中,这个类的字节码文件对象是SellTicket.class

    代码例子:

      

     1 public class SellTicket implements Runnable {
     2     // 定义100张票
     3     private int ticket = 100;
     4     
     5     //定义同一把锁
     6     private Object obj = new Object();
     7     
     8     
     9     public synchronized void run() {
    10         
    11         //假设一直在售票
    12         while(true){
    13         //现实中买票时,都会有延迟的,所以让线程休息下
    14         try {
    15             Thread.sleep(100);
    16         } catch (InterruptedException e) {
    17             e.printStackTrace();
    18         }
    19         if(ticket > 0){
    20             System.out.println(Thread.currentThread().getName()+"正在出售第"+(ticket--)+"张票");
    21         }
    22     }
    23     }

    结果跟方式1的一样

    那么,方式1和方式2,使用哪个?

      A:如果锁对象是this,就可以考虑使用同步方法(一个方法一进去就看到了代码被同步了)

      B:否则,能使用同步代码块的尽量使用同步代码块

    何事都只需坚持.. 难? 维熟尔。 LZL的自学历程...只需坚持
  • 相关阅读:
    冒泡排序
    Window中常见的dos命令
    spring boot 重定向
    阿里云轻量级服务器使用
    网络知识
    spring boot security 登出
    深入理解java虚拟机
    jsp内置对象与servlet的关系
    求一个有向无换图中,最长简单路径。动态规划问题15-1
    一些动态规划问题的java实现
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5936352.html
Copyright © 2011-2022 走看看