static

Synchronized修饰静态变量和普通变量的区别

懵懂的女人 提交于 2020-02-21 05:39:59
这里主要涉及到类对象(static方法),对象方法(非static方法) 我们知道,当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例); 当synchronized修饰一个非static方法时,多线程下,获取的是对象锁(即类的实例对象) 所以,当synchronized修饰一个static方法时,创建线程不管是new JoinThread()还是new Thread(new JoinThread()),在run方法中执行inc()方法都是同步的; 相反,当synchronized修饰一个非static方法时,如果用new JoinThread()还是new Thread(new JoinThread())方式创建线程,就无法保证同步操作,因为这时 inc()是属于对象方法,每个线程都执有一个独立的对象实例new JoinThread(),所以多线程下执行inc()方法并不会产生互斥,也不会有同步操作。 另外如果考虑到变更的原子操作,可使用atomic包下面的包装对象,这些对象都是对volatile修饰变量的一种延伸,可保证变量的原子操作而不用去同步方法或 代码块是否同步。 来源: https://www.cnblogs.com/tiancai/p/8204024.html

android常见内存泄漏

无人久伴 提交于 2020-02-20 09:09:29
1、静态变量 类中定义了静态Activity变量,把当前的Activity赋值给静态变量,如果Activity生命周期结束的时候静态变量没有清空,就会导致内存泄漏。static变量是贯穿整个应用的生命周期,所以被泄漏的Activity就会一直存在于应用的进程中,不会被回收。 private static Activity sActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); sActivity = this; findViewById(R.id.btn_back).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); } } 2、 非静态内部类 创建 静态实例 这里的非静态内部类是Config,创建的静态实例是sConfig 造成内存泄漏的原因是 内部类会隐式持有外部类的引用 ,这里的外部类是NonStaticActivity,然而内部类sConfig又是static静态变量

单例模式

偶尔善良 提交于 2020-02-20 04:38:57
1.概述   单例模式用来保证系统中一个类只有一个实例且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。    我的理解是:单例模式的实质就是私有化构造函数(保证只有一个实例)、析构函数(保证只有单例类能删除自己,防止其他类删除单例类造成悬浮引用)、拷贝构造函数(禁止类拷贝)、重载=操作符(禁止类赋值)。 2.常用的场景   单例模式常常与工厂模式结合使用,因为工厂只需要创建产品实例就可以了,在多线程的环境下也不会造成任何的冲突,因此只需要一个工厂实例就可以了。 3.全局变量和单例模式的比较   采用全局或者静态变量,会影响封装性,难以保证别的代码不会对全局变量造成影响。   全局变量可以提供单例模式实现的全局访问这个功能,但它不能保证应用程序只有一个实例。 4.代码及分析 1) 懒汉式单例模式   懒汉式是典型的时间换空间 。就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间。 1 class Singleton { 2 public: 3 static Singleton* getInstance(); 4 //析构的时候释放资源~ 5 ~Singleton() { 6 if( (_instance != NULL) 7 delete _instance; 8 } 9 protected: 10 Singleton(); 11 private: 12

SpringBoot中静态资源访问方案

折月煮酒 提交于 2020-02-19 01:33:03
一、静态资源到底要放在哪里 学习之前,先了解一下当使用SpringMVC框架访问静态资源时,静态资源会被拦截,需要添加额外配置。今天我们就这个问题来讨论一下。 【 SSM中的配置 】 其实在搭建SSM环境时,可以通过 <mvc:resources /> 节点来配置不拦截静态资源,代码如下: < mvc: resources mapping = " /js/** " location = " /js/ " /> < mvc: resources mapping = " /css/** " location = " /css/ " /> < mvc: resources mapping = " /html/** " location = " /html/ " /> 这是一种Ant风格的路径匹配符, /** 表示可以匹配任意层级的路径,所以上面的代码可以简化为: < mvc: resources mapping = " /** " location = " / " /> 上面这种配置是通过xml文件实现的,而且通俗易懂,其实在Java中也可以通过Java代码实现,如果通过Java代码实现,可以自定义一个类,并且让其集成 WebMvcConfigurationSupport 即可,代码如下: @Configuration @ComponentScan ( basePackages =

C++中几个关键字

江枫思渺然 提交于 2020-02-18 04:50:49
volatile 编译优化时,为 提高存取速度 ,有时会把变量读取到寄存器,方便读取;但有时别的线程改变了变量的值,但寄存器值不变,造成程序读取值不一致,所以 使用volatile从变量内存中读取。 修饰某个变量,表明某个变量的值可能随时被外部改变,因此对这些变量的存取不能缓存到寄存器,每次使用时需要重新读取,从变量的地址中(内存中)读取数据。 volatile的作用 是告知编译器,它修饰的变量随时都可能被改变。因此,编译后的程序每次在使用该变量的值时,都会从 变量的地址中读取 数据,而不是从寄存器中获取。 作用:在进行编译时不优化,在执行的时候不缓存, 每次都需要从内存中读出(保证内存的可见性) 场景:多用于多线程或多CPU编程 static和const static和const static关键字至少有下列几个作用: (1)函数体内static变量的 作用范围为该函数体 ,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值; (2)在模块内的static全局变量可以被 模块内所用函数 访问,但不能被模块外其它函数访问; (3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的 使用范围被限制在声明它的模块内 ; (4)在类中的static成员变量属于 整个类所拥有 ,对类的所有对象只有一份拷贝; (5

Java学习笔记(十二)面向对象---内部类

痴心易碎 提交于 2020-02-18 02:31:02
内部类的访问规则 内部类可以直接访问外部类中的成员,包括私有成员。 因为内部类中持有了一个外部类的引用,格式为:外部类名.this 外部类要访问内部类,必须要建立内部对象。 class Outer { //外部类 private int x = 1; class Inner{ //内部类 int x = 2; void function() { int x = 3; System.out.println(x); System.out.println(this.x); System.out.println(Outer.this.x); } } void method() { Inner in = new Inner(); in.function(); } } public class InnerClassDemo { public static void main(String[] args) { Outer out = new Outer(); out.method(); Outer.Inner in = new Outer().new Inner(); in.function(); } } 运行结果: 3 2 1 3 2 1 访问 当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象。 格式: 外部类名.内部类名 变量名 = 外部类对象.内部类对象;

【翻译】C#编程语言和JAVA编程语言的比较(上)

僤鯓⒐⒋嵵緔 提交于 2020-02-17 15:56:34
原文地址: http://www.25hoursaday.com/CsharpVsJava.html 简介 C#语言是一门面向对象的语言,开发者可以使用C#和微软.NET平台快速构建各种应用程序。C#和.NET平台的目标是把开发者从一些诸如内存管理、类型安全问题、底层类库、数组边界检查等等的底层问题中解放出来并节约大量的时间,这样开发者就可以真正把时间和精力放在他们的应用程序和业务逻辑上。对于Java开发者来说,把前面那句话的开头改为“Java语言和平台”,这句话也同样可以总结Java语言和平台。 后面的内容介绍了C#和Java编程语言的异同,这些都是基于我使用两个语言的经历。所有代码都经过微软.NET框架2.0以及Java SE 6的测试。 注意:作者有些代码不符合.NET 3.5或JAVA SE 7(或以上)版本的最佳实践写法并且也不能覆盖它们所提供的新语法和新特性,但不影响本文的重点也就是平台的比较。 第一部分:C#和JAVA基本一致的地方 1、我们都是Object C#的类层次中有一个根,也就是所有C#的类都是System.Object的子类,Java也是这样,所有类都是java.lang.Object的子类。两个语言的Object类的方法有些相同(比如System.Object的ToString()和java.lang.Object的toString()),也有一些不同

JAVA与C#的区别

左心房为你撑大大i 提交于 2020-02-17 15:50:16
Java和C#都是编程的语言,它们是两个不同方向的两种语言 相同点: 他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态) 区别: 1.c#中的命名空间是namespace类似于Java中的package(包),在Java中导入包用import而c#中用using。 2.c#和Java都是从main函数入口的,但是c#中的main函数的首字母必须大写,它有四种写法如下: static void Main(string args[]){} static int Main(string args[]){} static void Main(){} static void Main(){} 而Java中只有一种形式:static void main(String [] args){} 3.数据类型:Java跟c#基本都差不多,但是Java的String类型的首字母必须大写,而c#中可以小写也可以大写,还有布尔型,Java中是boolean,c#中是bool。 4.变量的命名:Java中可以用$符号,而c#中不可以使用。 5.注释:Java比c#少一种"///"的文档注释。 6.输出:c#有三种方式输出:Cosole.WriteLine(); Cosole.WriteLine(要输出的值); Cosole.WriteLine("格式字符串",变量列表);

虚拟机类加载机制

假装没事ソ 提交于 2020-02-17 07:39:04
1、概述 在Class文件中描述的各种信息,最终都需要加载到虚拟机中之后才能运行和使用。 虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。 在Java语言里面,类型的加载、连接和初始化过程都是在程序运行期间完成的,会增加性能开销,但提供高度的灵活性,Java里天生可以动态扩展的语言特性就是依赖运行期动态加载和动态连接这个特点实现的。例如,如果编写一个面向接口的应用程序,可以等到运行时再指定其实际的实现类;用户可以通过Java预定义的和自定义类加载器,让一个本地的应用程序可以在运行时从网络或其他地方加载一个二进制流作为程序代码的一部分,这种组装应用程序的方式目前已广泛用于Java程序之中。从最基础的Applet、JSP到相对复杂的OSGi技术,都使用了Java语言运行期类加载的特性。 2、类加载的时机 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中验证、准备、解析3个部分统称为连接(Linking)。如下图所示: 加载、验证、准备

【Java方法的声明和使用】

こ雲淡風輕ζ 提交于 2020-02-17 07:08:15
一、方法,Method,函数,function public class MethodTest01 { //定义一个方法,该方法完成两个int类型数据的求和 public static void sum(int a,int b){ int c = a+b; System.out.println(a+"+"+b+"="+c); } public static void main(String[] args){ //调用方法:类名.方法名 MethodTest01.sum(66,88); MethodTest01.sum(13,14); } } 二、 方法如何定义,语法: [修饰符列表] 返回类型类型 方法名(形式参数列表){ 方法体;//由加吧语句构成}1、目前阶段所有方法的修饰符列表统一写成:public static2、返回值类型可以是java中任何一种数据类型3、如果该方法执行结束之后没有任何返回值,那么返回值数据类型必须写成void4、如果方法的返回值类型不是void,而是其他的数据类型,那么在方法体中必须保证有rerurn值5、注意:如果return语句一旦执行,则标识该方法结束,所以return语句下面不能再编写其他的java语句6、方法名只要是合法的标识符即可7、方法的形式参数列表参数的个数可以是0个,也可以是1个,还可以是多个,如果是多个的话必须使用逗号隔开8