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的理解的更多相关文章

  1. Java 关键字static final使用总结

    Static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被 ...

  2. 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 ...

  3. 【Java关键字-Interface】为什么Interface中的变量只能是 public static final

    三个关键字在接口中的存在原因:public:接口可以被其他接口继承,也可以被类实现,类与接口.接口与接口可能会形成多层级关系,采用public可以满足变量的访问范围: static:如果变量不是sta ...

  4. Java中static、final、static final的区别(转)

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

  5. Java中static、final、static final的区别【转】

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

  6. Java中static、final、static final的区别(转)+transient

    说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final ...

  7. java的static final和final的区别

    转自:https://www.cnblogs.com/EasonJim/p/7841990.html 说明:不一定准确,但是最快理解. final: final可以修饰:属性,方法,类,局部变量(方法 ...

  8. static 和 final 和 static final

    众所周知,static 是静态修饰关键字:可以修饰变量,程序块,方法,类. 1.修饰变量. 得知:如果static修饰的是变量,则JVM会将将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都 ...

  9. java面试官:兄弟简单谈谈Static、final、Static final各种用法吧

    前言 对Static.final.Static final这几个关键词熟悉又陌生?想说却又不知怎么准确说出口?好的,本篇博客文章将简短概要出他们之间的各自的使用,希望各位要是被你的面试官问到了,也能从 ...

随机推荐

  1. 测试post

    http://www.atool.org/httptest.php 这里也可以测试 火狐有插件:HttpRequester Chrome有插件:Postman

  2. CentOS 安装SolrCloud

    1.什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候是不 ...

  3. Android中的sharedUserId属性详解

    在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见,而我们可以使他们对其他的应用程序可见,这会使我们用到 ...

  4. Ajax实例

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Index.aspx.cs& ...

  5. DataSet.Clear Method ()

    Clears the DataSet of any data by removing all rows in all tables. 需要注意的是这个方法不会清空DataSet中的DataTable, ...

  6. Django忘记管理员账号和密码的解决办法

    看着Django的教程学习搭建网站,结果忘记第一次创建的账号和密码了.结果搭建成功以后,一直无法登陆到管理页面,进行不下去了. 如图所示: 在网上找了很多的方法都不行,最后使用新建一个superuse ...

  7. vim使用札记

    最近开始用vim编辑器了,从最开始的配置到现在慢慢使用,我在这儿会贴出一些我的使用上遇到过的问题和如何解决的方案,留给自己和一些会用到的人看看 1.vim怎么使汇编语法高亮 开始不知道,然后把文件的后 ...

  8. [Effective Java]第九章 异常

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  9. 后台输出HTML

    在前台定义CSS样式: <style type="text/css"> .style1 { width: 120px; } .style3 { width: 488px ...

  10. CUBRID学习笔记 43 insert into

    cubrid的中sql查询语法insert into ------ 官方文档是英文的,看不明白可以参看ocracle的同类函数说明.很多都是一样的. INSERT INTO a_tbl1(id) VA ...