• 关于静态代码块的


    package com.zcd;
    
    public class StaticCode
    {
        public static void main(String[] args)
        {
            System.out.println("进入主方法");
            StaticCode sc = new StaticCode();
            sc = new StaticCode();
        }
        
        public StaticCode()
        {
            System.out.println("无参构造方法");
        }
        
        {
            System.out.println("代码块1");
        }
        
        {
            System.out.println("代码块2");
        }
        
        static{
            System.out.println("静态代码块1");
        }
        
        static{
            System.out.println("静态代码块2");
        }
    }

    执行结果如下:

    结论:

      ①、静态代码块是在Java虚拟机加载类的时候执行的。所以静态代码要比类的主方法还要先执行。而且,不管为该类创建多少个对象,静态代码块只执行一次。

      ②、非静态代码块是在创建类的时候执行的,注意主方法在非静态代码块之前执行的。

    一个类中有静态同步方法和非静态同步方法,静态同步方法与非静态同步方法之间是不会有竞态条件。锁的是两个对象,一个锁的是类,一个锁的是类的对象。所以不会影响。

    下面贴一个例子:

    package com.zcd;
    
    public class ThreadTest4
    {
        public static void main(String[] args)
        {
            Example example = new Example();
            
            TheThread1 t1 = new TheThread1(example);
    
            example = new Example();//如果把这句注释掉,变成一个对象两个线程,还是打印乱序。
            
            TheThread2 t2 = new TheThread2(example);
            
            t1.start();
            t2.start();
        }
    }
    
    class Example
    {
        static{
            System.out.println("静态代码块1");
        }
        
        static{
            System.out.println("静态代码块2");
        }
        
        public synchronized void execute1()
        {
            for(int i = 0; i < 50; i++)
            {
                System.out.println("example: " + i);
            }
        }
        
        public static synchronized void execute2()
        {
            for(int i = 0; i < 50; i++)
            {
                System.out.println("example: " + i);
            }
        }
    }
    
    class TheThread1 extends Thread
    {
        private Example example;
        
        public TheThread1()
        {
            
        }
        
        public TheThread1(Example example)
        {
            this.example = example;
        }
        
        @Override
        public void run()
        {
            this.example.execute1();
        }
    }
    
    class TheThread2 extends Thread
    {
        private Example example;
        
        public TheThread2()
        {
            
        }
        
        public TheThread2(Example example)
        {
            this.example = example;
        }
        
        @Override
        public void run()
        {
            this.example.execute2();
        }
    }
  • 相关阅读:
    小朋友排队--第五届蓝桥杯
    Spring IOC源代码具体解释之整体结构
    Libimseti推荐系统
    Codeforces Round #277.5 (Div. 2)(C题)
    数据库经常使用函数
    Command terminated by signal 11
    winform程序公布后,client下载报错“您的 Web 浏览器设置不同意执行未签名的应用程序”
    Cocos2d-x学习笔记(四) 布景层的加入移除
    FMSC 使用理解
    将浮点数保持几位小数,尾数舍入的Format函数
  • 原文地址:https://www.cnblogs.com/GooPolaris/p/7920322.html
Copyright © 2020-2023  润新知