static final的理解
static:
static静态,可以修饰类,成员变量,成员方法,代码块。static修饰的成员变量和方法独立于该类的任何对象,也就是被类的所有成员共享,这要这个类被加载,虚拟机就能根据类名在运行时数据区的方法区找到他们。无需对象引用。static会将所有应用的属性,方法以及内部类直接产生引用关系,而并非与类的实例,这时为什么可以使用类名.方法名就能引用的原因。由static修饰的代码块在类被加载的时候就已经执行,而非静态代码块是类在被创建的时候执行。
上面那些不是我想说的,static最重要的一点就是类属性中被static修饰的变量会被作为GC的root根节点。作为根节点就以为着,这些类变量是基本上不会被回收的,因此static很容易引入内存泄露的危险。
volatile:
volatile的重点就是可见性,向要知道可见性到底是什么就需要弄明白主存和工作内存。java内存模型规定了所有的变量都储存在主内存(Main Memory)中。没条线程还有自己的工作内存(Working Memory),线程的工作内存中保存了该线程使用到的变量的主内存副本拷贝,县城对变量的所有操作(读取,赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不用的线程之间也不发直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。
当一个变量定义为vaolatile之后,它将具备两种塔形,第一是保证此变量对所有线程的可见性,可见性是指当一条线程修改了自己的这个变量的值,新值对其他线程来说是可以立即得知的。而普通变量不能,如:线程A修改一个普通变量的值,然后向主内存进行回写,灵位一条线程B在线程A回写完成后在从主内存进行读取操作,新变量才会对线程B可见。但是,volatile并不是线程安全的。虽然使用了volatile后,每次获取的值都是最新的,但是java里面的运算并不是原子性的。
由于volatile变量只能保证可见性,在不符合以下两条规则的运算场景中,我们仍然要通过加锁来保证原子性:
--运算结果并不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
--变量不需要与其他的状态变量共同参与不变约束。
使用volatile变量的第二个语义是禁止指令重排序优化,普通的变量仅仅会保证在该方法的执行过程中都能得到正确的结果,而不能保证其中的操作过程是按照自己代码的顺序去运行。因为在一个线程的方法执行过程中无法感知到这点,这也就是java内存模型中描述的所谓的“线程内表现为串行的语义”。
transient:
用transient修饰的属性,在序列化的时候不会添加这个属性。如User类中包括password,在序列化的时候不希望序列化这个属性,既可以用transient修饰。
final:
final修饰的类不能被被继承。
final修饰的属性不能修改。
final修饰的的方法 一:不能被子类重写;二:编译器在遇到final修饰的方法时会使用内嵌机制,大大提高效率。
final修饰的参数,只能读取,不能修改。
static final的理解的更多相关文章
- Java 关键字static final使用总结
Static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被 ...
- The serializable class does not declare a static final serialVersionUID field of type long
在编译以下Java程序时,出现The serializable class does not declare a static final serialVersionUID field of typ ...
- 【Java关键字-Interface】为什么Interface中的变量只能是 public static final
三个关键字在接口中的存在原因:public:接口可以被其他接口继承,也可以被类实现,类与接口.接口与接口可能会形成多层级关系,采用public可以满足变量的访问范围: static:如果变量不是sta ...
- Java中static、final、static final的区别(转)
说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...
- Java中static、final、static final的区别【转】
说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...
- Java中static、final、static final的区别(转)+transient
说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...
- java的static final和final的区别
转自:https://www.cnblogs.com/EasonJim/p/7841990.html 说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法 ...
- static 和 final 和 static final
众所周知,static 是静态修饰关键字:可以修饰变量,程序块,方法,类. 1.修饰变量. 得知:如果static修饰的是变量,则JVM会将将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都 ...
- java面试官:兄弟简单谈谈Static、final、Static final各种用法吧
前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...
随机推荐
- discuz安装与学习资料
discuz的安装地址:http://www.discuz.net/thread-3457145-1-1.html 一些学习资料:http://www.discuz.net/forum-10-1.ht ...
- Mysql-学习笔记(==》权限管理 十 三)
-- 用户与权限管理-- 查看当前服务器上的所有账号密码主机SELECT USER,PASSWORD,HOST FROM mysql.user; -- 设置账号密码SET PASSWORD=PASSW ...
- CentOS 6.3下源码安装LAMP(Linux+Apache+Mysql+Php)环境
一.简介 什么是LAMP LAMP是一种Web网络应用和开发环境,是Linux, Apache, MySQL, Php/Perl的缩写,每一个字母代表了一个组件,每个组件就其本身而言都是在它所代 ...
- 【MySQL】过滤后的结果集较大,用LIMIT查询分页记录,查询效率不理想
> 参考的优秀文章 优化LIMIT分页--<高性能MySQL>(电子工业出版社) > 场景描述 遇到一个场景:查询排序后的结果集较大,我们采用分页显示,每页显示20条记录,但是 ...
- PostGIS_导入shp格式的数据
1.导入shp到PostGIS 开启PostGIS shp Loader,如下图: 打开View connection details....输入连接数据库的参数,如下: 连接成功后,点击Add Fi ...
- Random类和ThreadLocalRandom类
Random类和ThreadLocalRandom类 Random类用于生成一个伪随机数,他有两个构造方法:一个构造方法使用默认的种子(以当前时间作为种子),另一个构造方法需要显示传入一个long型整 ...
- 实现Action类
实现Action类 1.Action类的作用: (1)封装HTTP的请求参数: (2)处理用户请求: (3)封装处理结果. 2.Action类是什么,在Action类中应该包含什么: Action类就 ...
- ubuntu Linux 测试PHP却提示下载文件的解决办法
ubuntu Linux 测试PHP却提示下载文件的解决办法 一般这种情况都是在刚刚开始配置环境时出现的, 输入 sudo a2enmod php5 看提示如果出现“$ This module ...
- 苹果原生NSURLSession的上传和下载
关于NSURLSession的上传和下载 在iOS7.0后,苹果公司新推出了一个NSURLSession来代替NSURLConnection.NSURLConnection默认是在 主线程执行的.而N ...
- Linux基础※※※※如何使用Git in Linux(一)
参考资料: 1. https://www.linux.com/learn/tutorials/796387-beginning-git-and-github-for-linux-users/ 2. h ...