java基础——java内存,两种单例模式

/*
 * java运行内存:
 *     堆(heap):存储的全是对象,每个对象都包含一个与之对应的class信息
 *                只有一个heap,被所有线程共享,heap中不存放基本数据类型和对象引用,只放对象本身
 *     栈:每个线程都有属于自己的栈(用户态栈),栈中保存基本数据类型的对象和自定义对象的引用,这个引用指向了堆区的实例
 *     方法区(静态区):被所有线程共享,包含所有的class和static变量
 *                  包含整个程序中永远唯一的元素,即class,static变量
 *
 *
 * 如何确定一个属性,方法要确定为static
 *     属性:可以被多个对象共享,不会随着对象不同而不同
 *     方法:操作静态属性的方法
 *          工具类中的方法,习惯上申明为static.比如:Math,Arrays,Collections
 * */

单例模式

/*
 *     单例模式
 *    对比:
 *    饿汉式:
 *        好处:线程安全
 *        坏处:加载时间长
 *    懒汉式:
 *        好处:延迟创建
 *        坏处:线程不安全,创建对象时有并发
 *
 *    常用单例模式场景:
 *        网站计数器,应用程序的日志应用,数据库连接池,读取配置文件类
 *        Application,任务管理器,回收站
 * */

饿汉式,随着类被加载时就new

/*
 * 1.饿汉式:一开始就new出来
 * */
class Bank{
    //1.私有化构造器
    private Bank() {}

    //2.内部创建类的静态对象
    private static Bank instance = new Bank();

    //3.提供static公共方法,返回类对象
    public static Bank getInstance() {
        return instance;
    }
}

懒汉式

/*
 * 2.懒汉式:什么时候要用什么时候再造
 * */
class Order{
    //1.私有化构造器
    private Order() {}

    //2.声明当前类静态对象,没有初始化
    private static Order instance = null;

    //3.声明public static的返回当前类对象的方法
    public static Order getInstance() {
        if(instance == null)
            instance = new Order();
        return instance;
    }

}

原文地址:https://www.cnblogs.com/zsben991126/p/12148167.html

时间: 2024-10-13 20:37:06

java基础——java内存,两种单例模式的相关文章

java基础——多线程的两种实现方式

第一种实现方式:继承Thread类,并实现run方法,这种情况下每个线程对象都有一个独立的run方法 package thread; /* @author zsben @create 2020-01-03 9:52 多线程创建的第一种方法:继承于Thread类 1.创建一个继承于Thread的类 2.重写Thread类的run方法-->将此线程执行的操作声明在run中 3.创建Thread子类对象 4.通过此对象调用start方法:启动当前线程,调用当前线程的run方法 */ //1.创建一个继

7、java实现的两种单例模式

/* 两种单例模式的演示 */ //饿汉式 class Signal { private Signal(){} private Signal s = new Signal(); public static Signal getInstance() { return s; } } //懒汉式 class Signal { private Signal(){} private Signal s = null; public static Signal getInstance() { if(s ==

java基础---JVM内存管理以及内存运行机制学习总结

自己从网上搜资料拼接了一张JVM内存图:如下图所示: 我们思考几个问题: 1.jVM是怎么运行的? 2.JVM运行时内存是怎么分配的? 3.我们写的java代码(类,对象,方法,常量,变量等等)最终存放在哪个区? VM运行时数据区域: 1.程序计数器(program Counter Register):   是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器.在虚拟机的概念模型里(仅是概念模型,各种虚拟机可能会通过一些更高效的 方式去实 现),字节码解释器工作时就是通过改

[Java基础] Java float保留两位小数或多位小数

方法1:用Math.round计算,这里返回的数字格式的. float price=89.89; int itemNum=3; float totalPrice=price*itemNum; float num=(float)(Math.round(totalPrice*100)/100);//如果要求精确4位就*10000然后/10000 方法2:用DecimalFormat 返回的是String格式的.该类对十进制进行全面的封装.像%号,千分位,小数精度.科学计算. float price=

[Java基础] Java对象内存结构

转载地址:http://www.importnew.com/1305.html 原文于2008年11月13日 发表, 2008年12月18日更新:这里还有一篇关于Java的Sizeof运算符的实用库的文章. 学C/C++出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制.而在C++中就可以通过sizeof运算符来获得基本类型以及类实例的大小.C和C++中的这个操作符对于指针运算.内存拷贝和IO操作都非常有用. Java中并没有一个类似的运算符.事实上,Java也不需要这种运

java 实现多线程的两种方式

一.问题引入 说到这两个方法就不得不说多线程,说到多线程就不得不提实现多线程的两种方式继承Thread类和实现Runable接口,下面先看这两种方式的区别. 二. Java中实现多线程的两种方式 1.  继承Thread类 /** * 使用Thread类模拟4个售票窗口共同卖100张火车票的程序,实际上是各卖100张 */ public class ThreadTest { public static void main(String[] args){ new MyThread().start(

对Java代码加密的两种方式,防止反编译

使用Virbox Protector对Java项目加密有两种方式,一种是对War包加密,一种是对Jar包加密.Virbox Protector支持这两种文件格式加密,可以加密用于解析class文件的java.exe,并且可以实现项目源码绑定制定设备,防止部署到客户服务器的项目被整体拷贝. 两种加密方式 War 包加密 当你的项目在没有完成竣工的时候,不适合使用 war 文件,因为你的类会由于调试之类的经常改,这样来回删除.创建 war 文件很不爽,最好是你的项目已经完成了,不改了,那么就打个 w

简述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被

Java开启线程的两种方式

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.ios培训..Net培训</a>.期待与您交流!------ Java开启线程的两种方式: 方式一:成为线程(Thread)的儿子,即继承Thread类简单代码如下:class Student extends Thread{Student(String name){super(name);}public

述java中抛出异常的两种方式

java编程中经常遇到异常,这时就需要利用java中的异常抛出机制,在java中提供了两种抛出异常的方法:try{}  catch() {}和throw. 一.抛出异常的两种方式 (1) 首先我们来看一下try()  catch(){}这种方式: ? 1 2 3 4 5 6 try{    i=9\0; } catch(exception e) {     system.out.println("除数不能为0"): } 该种方式是将待执行的代码放入try中,如果执行的代码发生异常就会被