首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

java – 为什么InputStream#read()返回一个int不是一个字节?

这个是一个有意思的问题,所以我在这里记录一下。 首先字节正好是8位,所以使用8位的char类型数据来与字节数据相互一一对应是最好的选择?...但是为何方法InputStream#read()需要返回int类型值呢?...首先,我们要完成一个EOF(End of File)判断,在Java中就是以-1来表示数据读完了,但是如果返回的char类型值,那么根本没有-1这个数值;如果换种方式,返回一个特殊的char值,比如char...因此,当您将局部变量或对象字段声明为(例如)一个字节时,变量/字段将像int一样存储在32位单元中。...换言之,我们没有在这个应用中返回int/short类型的数据是没有区别的,所以我们不妨就使用代表其实际内存模型的int类型值。

1.2K20

Java 构造结构私有化

; } } 现在的instance在Singleton里面只是一个普通的类属性,所有的普通类属性必须在类产生实例化对象之后才可以使用,但是否可以存在一种属性,可以让类属性不受Singleton...;一旦封装属性之后,只可以通过getter方法来实现访问属性,由此需要提供一个geter方法不受到类的new实例化控制;可以使用static属性继续声明该方法。...上述代码的意义: 如果需要控制一个类中实例化对象的产生个数,必须将构造给private私有化(锁住类中的构造方法)因为在实例对象的时候都要使用构造方法,如果构造方法私有化,自然无法直接产生实例化对象...,既然只需要一个实例化对象,由此可以在类的内部定义一个公共对象,并且每一次通过static方法返回唯一的一个对象,这样外部不管是多少次的调用,最终的类只能产生唯一的对象,这样的设计属于单例设计模式。...如果在static声明的方法中,返回不是唯一的实例化对象的类属性,而是在方法中直接返回实例化对象,结果就是,每一个返回的对象都不是唯一的;为了防止这种情况发生,可以在instance类属性定义的时候,

56510
您找到你想要的搜索结果了吗?
是的
没有找到

设计模式之单例模式

所谓单例模式,就是所有的请求都用一个对象来处理,如我们常用的Spring默认就是单例的,多例模式是每一次请求都创建一个的对象来处理,如structs2中的action。...我们知道,通常我们会通过new关键字来创建一个的对象。这个时候类的构造函数是public公有的,你可以随意创建多个类的实例。...但是,如果在多线程中使用,就会发现它们返回实例有可能不是一个。我们可以通过代码来验证一下。...这是因为,饿汉式单例在类加载时,就创建了类的实例,也就是说在线程去访问单例对象之前就已经创建好实例了。一个类在整个生命周期中只会被加载一次。因此,也就可以保证实例只有一个。...同样的道理,我们是不是也可以通过定义一个静态内部类来保证类属性只被加载一次呢。

55910

单例模式(Singleton)

意图 单例模式是一种创建型模式,它能确保一个类只有一个实例,并提供一个访问该实例的全局节点。 问题 单例模式同时解决了两个问题, 所以违反了单一职责原则: 保证一个类只有一个实例。...它的运作方式是这样的: 如果你创建了一个对象, 同时过一会儿后你决定再创建一个对象, 此时你会获得之前已创建的对象, 不是一个对象。...注意, 普通构造函数无法实现上述行为, 因为构造函数的设计决定了它必须总是返回一个对象。 为该实例提供一个全局访问节点。...无论何时调用该方法, 它总是会返回相同的对象。 结构 单例(Singleton)类声明了一个名为get­Instance获取实例的静态方法来返回其所属类的一个相同实例。...该方法会在首次被调用时创建一个对象,并将其存储在静态成员变量中。此后该方法每次被调用时都返回实例。 将类的构造函数设为私有。 类的静态方法仍能调用构造函数, 但是其他对象不能调用。

47920

python设计模式-单例模式

如果同时存在两个ChocolateBoiler实例,那这么多判断岂不是失去作用了。那我们改如何实现这个需求呢?这个问题的核心是,我们要先判断实例不是已经存在,如果存在就不再创建。...else: # 如果不存在,创建一个的 _chocolate_boiler_instance = ChocolateBoiler() return...这种保证 ChocolateBoiler类只有一个实例,并提供一个全局访问点的模式,就是单例模式。 单例模式 定义 单例模式:确保一个类只有一个实例,并提供一个全局访问点。...我们也提供对这个实例的全局访问点:当你需要实例时,像类查询,它会返回单个实例。...__ 创建实例,并将实例赋值给 __it__,然后返回实例 最简单的方式 将名字singleton绑定到实例上,singleton就是它自己类的唯一对象了。

52340

今天再来聊聊单例设计模式

,那么以后就可以使用同一个实例了,如果每次生成实例就没有必要了。...== null的判断,就可以保证线程安全了,这样实例化代码只用调用一次,后面再次访问的时候,只会判断第一次的if (singleton == null)就可以了,然后会跳过整个if块,直接返回实例化对象...if判断,另外一个线程需要等待锁释放,不过当第一个线程执行完new Singleton()语句后,就会退出synchrinized保护的区域,这时如果没有第二个判断,那么第二个线程也会创建一个实例,这就破坏了单例...了,就会通过第一个判断,直接返回对象,其实这个时候的singleton并没有完成初始化,所以使用这个实例的时候就会报错。...其三是防止破坏单例,Java对于枚举的序列化做了要求,仅仅是将枚举类对象的name属性输出到结果中,在反序列化时,就是通过java.lang.Enum的valueOf方法,来根据名字查找对象,不是新建一个的对象

25210

Effective Java - 静态方法与构造器

实例,每次判断 INSTANCE 是否为null,如果是null,则创建并返回 new Singleton() 的引用,否则,只是返回之前创建出来的Singleton 的引用。...实例受控的类 编写实例受控的类有几个原因: 1. 实例受控的类确保类是一个 Singleton Singleton是指仅仅被实例化一次的类。那么如何编写一个安全的Singleton呢?...NullPointerException(); this.c = c; } ... } 这是Collections.java 中的代码片段,静态方法 unmodifiableCollection 返回一个的...2 静态工厂方法很难被发现 在API文档中,它们没有像构造器那样在API文档中被标明,因此,对于提供了静态工厂方法不是构造器的类来说,要想查明如何实例一个类是非常困难的。...StackWalker.getInstance(options); create 或者 newInstance ——— 像instance 或者 getInstance 一样,但create 或者 newInstance 能够确保每次调用都返回一个实例

84430

白话梳理创建型设计模式:单例、原型,构建

陆续整理,按照设计模式类型,创建型,结构型,行为型发布 博文会用通俗的话梳理一些自己的理解,结合开发中的实际场景, 关于设计模式,个人觉得,在理解上要站着它要解决的问题域的角度,不是它的实现方式,因为学完全部的设计模式...,即实例所开辟的空间会存在很长时间,内存角度考虑,不是好的实现。...原型模式,用通俗的话讲,即在原有实例的基础上创建多个实例,减少多实例和复杂实例创建的内存消耗。...通过一个最简单的建造者设计模式应用体会下,比如一个Bean的生成,涉及的属性较多,构造函数很不方便,可以使用建造者设计模式,通setter 方法对属性赋值,返回一个this的方式(区别于传统的setter...方法),每个setter 方法的调用即是一次构建,返回的是不同的实例(属性不同)。

24130

C#设计模式学习笔记-单例模式

它的主要特点不是根据客户程序调用生成一个实例,而是控制某个类型的实例数量-唯一一个。(《设计模式-基于C#的工程化实现及扩展》,王翔)。...也就是说,单例模式就是保证在整个应用程序的生命周期中,在任何时刻,被指定的类只有一个实例,并为客户程序提供一个获取该实例的全局访问点。   ...,并且在该函数提供控制实例数量的功能,即通过if语句判断instance是否已被实例化,如果没有则可以同new()创建一个实例;否则,直接向客户返回一个实例。   ...再看外层的if语句块,这使得每个线程欲获取实例时不必每次都得加锁,因为只有实例为空时(即需要创建一个实例),才需加锁创建,若果已存在一个实例,就直接返回实例,节省了性能开销。   ...由此可以看到这个类被加载时,会自动实例化这个类,不用在第一次调用GetInstance()后才实例化出唯一的单例对象。

48320

Python new 类方法和 ini

该特殊方法被调用时,会创建类(cls)的一个实例返回实例被创建后解释器会将该实例以及其它的参数传递给该实例的初始化函数 __init__,以对实例进行初始化。...所以,__new__ 方法是一个类方法,用于创建一个实例 __init__ 方法是一个实例方法,用于初始化一个实例。...__new__(cls, *args, **kwargs) 如果 __new__ 方法不返回 cls 的一个实例,那么实例的 __init__ 方法不会被调用。..._instance assert Singleton() is Singleton() # 断言成功 所谓单例模式就是每次初始化都返回一个实例,所以两次初始化得到的对象的内存地址应该是一样的: print...我猜 Python 解释器在内部可能做了优化,像 print A(), A() 这样的语句,解释器认为没有必要创建不同的对象,直接返回一个实例的引用得了。是不是觉得解释器有些自作聪明!

1.5K30

spring bean的作用域

和global session,5种作用域说明如下: singleton:单例模式,Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。...单例模式 prototype:原型模式,每次通过Spring容器获取prototype定义的bean时,容器都将创建一个的Bean实例,每个Bean实例都有自己的属性和状态,singleton全局只有一个对象...而对不同的Session请求则会创建实例,该bean实例仅在当前Session内有效。...,同Http请求相同,每一次session请求创建实例不同的实例之间不共享属性,且实例仅在自己的session请求内有效,请求结束,则实例将被销毁。...Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。

1.2K20

8种单例模式写法助你搞定面试

私有构造函数 它将阻止从类外部实例对象 它应该只有一个实例 这是通过在类中提供实例来方法完成的,阻止外部类或子类来创建实例。...,此时instance已经被赋予了实例,t1线程退出同步块,直接返回了第一个创造的实例,此时t2线程获得线程锁,也进入同步块,此时t1线程其实已经创造好了实例,t2线程正常情况应该直接返回的,但是因为同步块里没有判断是否为...null,直接就是一条创建实例的语句,所以t2线程也会创造一个实例返回,此时就造成创造了多个实例的情况。...1.分配内存 2.初始化构造器 3.将对象指向分配的内存的地址 因为仅仅一个new 实例的操作就涉及三个子操作,所以生成对象的操作不是原子操作 实际情况是,JVM会对以上三个指令进行调优,其中有一项就是调整指令的执行顺序...,直接返回一个引用。

39930

一篇通俗易懂的文章让你彻底了解设计模式中的单例模式

概念: 就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法静态方法。...instance = new Singleton(); //3.对外提供一个共有的静态方法 返回实例对象 public static Singleton getInstance(){...提供一个共有的静态方法,返回实例对象 public static Singleton getInstance(){ return instance; } } 这种与上面的方法类似...不仅能避免多线程同步问题,而且还能防止反序列化重新创建的对象。 推荐使用 JDK中java.lang.Runtime就是经典的单例模式(饿汉式)。...想要获取单例类的时候,要使用对应获取对象的方法,不是new 好了到这里,单例模式的所有情况就已经讲完了。小伙伴们是否有所收获。

19720

单例模式的实现和性能对比

简介 单例指的是只能存在一个实例的类(在C#中,更准确的说法是在每个AppDomain之中只能存在一个实例的类,它是软件工程中使用最多的几种模式之一。...在第一个使用者创建了这个类的实例之后,其后需要使用这个类的就只能使用之前创建的实例,无法再创建一个实例。通常情况下,单例会在第一次被使用时创建。...单例类都只有一个private的无参构造函数 . 类声明为sealed(不是必须的) . 类中有一个静态变量保存着所创建的实例的引用 ....单例类会提供一个静态方法或属性来返回创建的实例的引用(eg.GetInstance) 几种实现 一. 非线程安全 //Bad code! Do not use!...注意这里我们使用的是新建一个private的object实例padlock来实现锁操作,不是直接对Singleton进行上锁。

40530

面试官:Spring创建好的单例对象存在线程安全问题吗?

来源:blog.csdn.net/jdk_wangtaida/ article/details/88738228 前言 这是我在一次面试中被问到过的问题,但是当时我回答的并不是太好,最近在学习多线程知识的时候又对这个问题有了的理解...public static Singleton getInstance(){ return singleton ;//直接返回单例对象 }} 这两种创建方式中,懒汉式在多线程环境下就是线程不安全的...return singleton ; } } ②在spring的框架里,对象是交给spring容器创建的,spring的创建单例的方式既不是懒汉式也不是饿汉式,是单例注册表模式实现单例模式的...③怎么判断使用已经创建好的单例对象是否线程安全 看这个单例里有没有全局变量(全局变量就是成员变量,成员变量又分实例变量和静态变量) 如果有全局变量,看它是不是只可以读取不能写入(有没有发布set方法)...4.其实在很多文章中对于spring的单例模式与线程安全会提到一个概念有状态对象和无状态对象,无状态对象在多线程环境下是线程安全的,有状态的对象则不是,其实这个字面的意思是比较对的,因为这个对象如果无法存储数据

76360

创建型模式(二)

对静态域使用延迟初始化,应使用这种方式不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。...我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。 优点: 1、性能提高。 2、逃避构造函数的约束。...(抽象类或者接口)实现 java.lang.Cloneable 接口 public Shape clone(); // 2.定义复制现有实例来生成实例的方法 具体原型角色:实现用于复制现有实例来生成实例的方法...最后,提供一个获取实例的方法,用来委托复制实例的方法生成实例。...();//委托复制实例的方法生成实例

28410

Spring Bean 作用域

例如,为了强制 Spring 在每次需要时都产生一个的 bean 实例,你应该声明 bean 的作用域的属性为 prototype。...同理,如果你想让 Spring 在每次需要时都返回一个bean实例,你应该声明 bean 的作用域的属性为 singleton。...作用域 描述 singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,默认值 prototype 每次从容器中调用Bean时,都返回一个实例,即每次调用getBean...当一个bean的作用域为 Singleton,那么 Spring IoC 容器中只会存在一个共享的 bean 实例,并且所有对 bean 的请求,只要 id 与该 bean 定义相匹配,则只会返回 bean...Prototype 是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是一个对象。

5110

Java单例模式中双重检查锁的问题

它偶尔会失败,不是总失败。此外,它失败的原因并不明显,还包含 Java 内存模型的一些隐秘细节。这些事实将导致代码失败,原因是双重检查锁定难于跟踪。...如果不保护 getInstance() 方法,则可能返回Singleton 对象的两个不同的实例。...线程 2 进入 if 代码块并创建一个Singleton 对象并在 //2 处将变量 instance 分配给这个对象。 线程 2 在 //3 处返回 Singleton 对象引用。...结果是 getInstance() 方法创建了两个 Singleton 对象,它本该只创建一个对象。...因为实例不为 null,线程 2 将 instance 引用返回一个构造完整但部分初始化了的 Singleton对象。 线程 2 被线程 1 预占。

1.8K20
领券