Android-Java-synchronized静态方法&字节码文件对象

上一篇博客 Android-Java-同步方法-synchronized中讲解了普通方法加入synchronized修饰符,此synchronized的同步锁是this,还介绍方法的封装性,这篇博客就不讲方法的封装性了

先看一个 静态方法加入修饰符synchronized(案例)

package android.java.thread12;

/**
 * 售票业务
 */
class Booking {

    /**
     * 模拟票的总算 10张票
     */
    private static int ticket = 10;

    /**
     * 加入了同步修饰符的方法synchronized,
     * 不管CPU如何疯狂的切换执行,
     * 只要同步方法里面的代码没有执行完,
     * 就不准其他线程进来执行
     * 这样就保证了多线程操作共享数据的安全性
     */
    public static synchronized void actionTicket() { // synchronized同步操作共享数据的代码

        // synchronized (BookingRunnable.class) {

            if (ticket > 0) {

                // 让线程在这里停一下,会更加容易复现线程的安全问题,就算不加这行代码,安全问题依然有
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("名称:" + Thread.currentThread().getName() + "窗口卖出第" + ticket + "张票");
                ticket--;
            }
        // }
    }
}

/**
 * 售票任务
 */
class BookingRunnable implements Runnable {

    @Override
    public void run() {

        while (true) {
            Booking.actionTicket();
        }
    }
}

/**
 * 售票案例
 */
public class BookingTest {

    public static void main(String[] args) {

        /**
         * 定义Runnable实现类Booking,此实现类Booking不是线程,此实现类Booking给四个Thread去执行的
         */
        Runnable booking = new BookingRunnable();

        // 实例化线程对象
        Thread thread1 = new Thread(booking); // 此实现类Booking给Thread去执行的
        Thread thread2 = new Thread(booking); // 此实现类Booking给Thread去执行的
        Thread thread3 = new Thread(booking); // 此实现类Booking给Thread去执行的
        Thread thread4 = new Thread(booking); // 此实现类Booking给Thread去执行的

        // 开启启动线程
        thread1.start(); // 启动第Thread-0窗口 执行卖票任务
        thread2.start(); // 启动第Thread-1窗口 执行卖票任务
        thread3.start(); // 启动第Thread-2窗口 执行卖票任务
        thread4.start(); // 启动第Thread-3窗口 执行卖票任务

    }

}

执行结果:

静态方法加入synchronized修饰符后,同步静态方法的??锁机制-->   锁??是当前类名.class

伪代码:>>>>> 静态方法同步的锁??是 == 当前类名.class    其实 (当前类名.class)就是字节码文件对象

public static synchronized(锁??是 当前类名.class) void actionTicket() {

  // .....
}

真实代码:

public static synchronized void actionTicket() { // synchronized同步操作共享数据的代码

        // synchronized (BookingRunnable.class) {

            if (ticket > 0) {

                // 让线程在这里停一下,会更加容易复现线程的安全问题,就算不加这行代码,安全问题依然有
                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                System.out.println("名称:" + Thread.currentThread().getName() + "窗口卖出第" + ticket + "张票");
                ticket--;
            }
        // }
    }

字节码文件对象 的描述 就是对类的类描述>>>Class

字节码文件对象,内存图:

public synchronized void 方法名(){} , 这种方式的同步锁??是 this,当前对象,是对象创建后才会有的 b = new 对象();,b也属于当前对象

public synchronized static void 方法名{},这种方式的同步锁??是以上图的(字节码文件对象),当前类的(字节码文件对象),当类加载进内存,就会产生(字节码文件对象);

原文地址:https://www.cnblogs.com/android-deli/p/10235832.html

时间: 2024-10-28 10:22:20

Android-Java-synchronized静态方法&字节码文件对象的相关文章

java中三种方式获得类的字节码文件对象

package get_class_method; public class ReflectDemo { /** * @param args */ public static void main(String[] args) { getClassObject1(); getClassObject2(); getClassObject3(); } public static void getClassObject1(){ Person p = new Person(); System.out.pr

java中反射机制通过字节码文件对象获取字段和函数的方法

pclass = Class.forName("get_class_method.Person"); //Field ageField = pclass.getField("age");//因为age成员变量是私有的,所以会产生NoSuchFieldException异常 Field ageField = pclass.getDeclaredField("age");//获得该对象反映此 Class 对象所表示的类或接口的指定已声明字段 Obje

java 字节码文件详解

每一个class字节码文件都唯一对应一个类或接口,class文件中记录中类或接口的基本信息,但反之不成立,不是每一个类或接口都有一个唯一对应的字节码文件,首先类或接口的字节码可以不以文件的方式存储,可以直接从内存中生成字节码,而不产生.class文件,动态代理的原理就是直接内存中生成字节码流,根据加载字节码流进行类加载操作,类实例化,生成代理对象. 字节码文件记录的信息:魔术,class文件主次版本,常量池数量及常量池表,类或接口的访问标志,类索引,超类索引,接口数量及接口表,字段数量及字段表,

JAVA字节码文件之第二篇(常量池)

一.常量池的内容 一个java类中定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如java类中定义的方法与变量信息.常量池中主要存储两类常量:字面量(文本字符串,final的常量)与符号引用(类和接口的全限定名,字段的名称和描述符,方法的名称和描述符 一.常量池的结构 二.常量池的分析 常量池(也称常量表):主版本号之后就是常量池的开始位置:java类所对应的常量池主要由常量池数量和常量池数组两部分组成,常量池数量是主版本号之后的两个字节:常量池数组在常

字节码文件初探

程序员编写的Java源文件(.java)经过编译,生成字节码文件(.class). Java程序的运行需要JVM(Java虚拟机,Java Virtual Machines)支持.JVM是一个软件,安装在操作系统中,为字节码文件提供运行环境. Java官方提供了针对不同平台的JVM软件(比如JVM  for Linux, JVM for Windows等),只要是标准的字节码文件,就可以在不同的JVM上运行且运行效果相同,这就是一次编程到处使用(也是Java程序的一个明显优点). 而其它语言,如

字节码文件的分析

//环境的搭建: 1.创建一个类并编译它 2.使用java命令:javap -c -verbose build/classes/java/main/com/yang/jvm/Test.class 将16进制的字节码文件转成可视化的文件内容如下: 具体内容如下: Classfile /F:/jvmdemo/build/classes/java/main/com/yang/jvm/Test.class Last modified 2019-10-17; size 573 bytes MD5 chec

【java】查看Java字节码文件内容的方法+使用javap找不到类 解决方法

研究synchronized底层实现,涉及到查看java字节码的需要 前提是,你的PC已经成功安装了JDK并别配置了环境变量. ==========查看方法========= 一.javap查看简约字节码方式 1.准备一个java文件 例如,文件所在目录在此处 Student.java文件内容如下: package com.sxd.sweeping.test.synchron; public class Student implements Runnable{ static int age; p

Java同步—线程锁和条件对象

线程锁和条件对象 在大多数多线程应用中,都是两个及以上线程需要共享对同一数据的存取,所以有可能出现两个线程同时访问同一个资源的情况,这种情况叫做:竞争条件. 在Java中为了解决并发的数据访问问题,一般使用锁这个概念来解决. 有几种机制防止代码收到并发访问的干扰: 1.synchronized关键字(自动创建一个锁及相关的条件) 2.ReentrantLock类+Java.util.concurrent包中的lock接口(在Java5.0的时候引入) ReentrantLock的使用 publi

java 面向对象基础 UML图 构造方法 对象 参数传值 关联关系 依赖关系

UML图 UML(Unified Modeling Language Diagram,UML),它是一个结构图,用来描述一个系统的静态结构.一个UML中通常包含类(class)的UML图,接口(Interface)的UML图以及泛化关系(Generalizaiton)的UML图.关联关系(Association)的UML图.依赖关系(Dependency)的UML图和实现关系(Realization)的UML图. 第一层是名字层,如果类的名字是常规字形,表明该类是具体类, 如果类的名字是斜体字形