织梦做的网站如何修改西宁网站建设开发
织梦做的网站如何修改,西宁网站建设开发,手机网站单页怎么做,西安房产信息网官网Java基础日常总结#xff01;#xff01;1. Java的字符类型采用的是Unicode编码方案#xff0c;每个Unicode码占用( )个比特位
在java中一个unicode占2个字节#xff08;byte#xff09;.一个字节等于8比特位#xff08;bit#xff09;.所以每个Unicode码占用 16 个比特…Java基础日常总结1. Java的字符类型采用的是Unicode编码方案每个Unicode码占用( )个比特位
在java中一个unicode占2个字节byte.一个字节等于8比特位bit.所以每个Unicode码占用 16 个比特位.2. 【Java.Spring.MVC】Spring在Web容器中的启动过程
首先对于一个web应用其部署在web容器中web容器提供其一个全局的上下文环境这个上下文就是ServletContext其为后面的spring IoC容器提供宿主环境
其次在web.xml中会提供有contextLoaderListener。在web容器启动时会触发容器初始化事件此时contextLoaderListener会监听到这个事件其contextInitialized方法会被调用在这个方法中spring会初始化一个启动上下文这个上下文被称为根上下文即WebApplicationContext这是一个接口类确切的说其实际的实现类是XmlWebApplicationContext。这个就是spring的IoC容器其对应的Bean定义的配置由web.xml中的context-param标签指定。在这个IoC容器初始化完毕后spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE为属性Key将其存储到ServletContext中便于获取
再次contextLoaderListener监听器初始化完毕后开始初始化web.xml中配置的Servlet这个servlet可以配置多个以最常见的DispatcherServlet为例这个servlet实际上是一个标准的前端控制器用以转发、匹配、处理每个servlet请求。DispatcherServlet上下文在初始化的时候会建立自己的IoC上下文用以持有spring mvc相关的bean。在建立DispatcherServlet自己的IoC上下文时会利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先从ServletContext中获取之前的根上下文(即WebApplicationContext)作为自己上下文的parent上下文。有了这个parent上下文之后再初始化自己持有的上下文。这个DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到大概的工作就是初始化处理器映射、视图解析等。这个servlet自己持有的上下文默认实现类也是xmlWebApplicationContext。初始化完毕后spring以与servlet的名字相关(此处不是简单的以servlet名为Key而是通过一些转换具体可自行查看源码)的属性为属性Key也将其存到ServletContext中以便后续使用。这样每个servlet就持有自己的上下文即拥有自己独立的bean空间同时各个servlet共享相同的bean即根上下文(第2步中初始化的上下文)定义的那些bean。参考https://blog.csdn.net/robinjwong/article/details/412802513. volatile和synchronized的区别volatile和synchronized特点
首先需要理解线程安全的两个方面执行控制和内存可见。
执行控制的目的是控制代码执行顺序及是否可以并发执行。
内存可见控制的是线程执行结果在内存中对其它线程的可见性。根据Java内存模型的实现线程在具体执行时会先拷贝主存数据到线程本地CPU缓存操作完成后再把结果从线程本地刷到主存。
synchronized关键字解决的是执行控制的问题它会阻止其它线程获取当前对象的监控锁这样就使得当前对象中被synchronized关键字保护的代码块无法被其它线程访问也就无法并发执行。更重要的是synchronized还会创建一个内存屏障内存屏障指令保证了所有CPU操作结果都会直接刷到主存中从而保证了操作的内存可见性同时也使得先获得这个锁的线程的所有操作都happens-before于随后获得这个锁的线程的操作。
volatile关键字解决的是内存可见性的问题会使得所有对volatile变量的读写都会直接刷到主存即保证了变量的可见性。这样就能满足一些对变量可见性有要求而对读取顺序没有要求的需求。
使用volatile关键字仅能实现对原始变量(如boolen、 short 、int 、long等)操作的原子性但需要特别注意 volatile不能保证复合操作的原子性即使只是i实际上也是由多个原子操作组成read i; inc; write i假如多个线程同时执行ivolatile只能保证他们操作的i是同一块内存但依然可能出现写入脏数据的情况。
在Java 5提供了原子数据类型atomic wrapper classes对它们的increase之类的操作都是原子操作不需要使用sychronized关键字。
对于volatile关键字当且仅当满足以下所有条件时可使用对变量的写入操作不依赖变量的当前值或者你能确保只有单个线程更新变量的值。该变量没有包含在具有其他变量的不变式中。123
volatile和synchronized的区别
volatile本质是在告诉jvm当前变量在寄存器工作内存中的值是不确定的需要从主存中读取 synchronized则是锁定当前变量只有当前线程可以访问该变量其他线程被阻塞住。volatile仅能使用在变量级别synchronized则可以使用在变量、方法、和类级别的volatile仅能实现变量的修改可见性不能保证原子性而synchronized则可以保证变量的修改可见性和原子性volatile不会造成线程的阻塞synchronized可能会造成线程的阻塞。volatile标记的变量不会被编译器优化synchronized标记的变量可以被编译器优化
如果想更好地理解这两个关键字的作用强烈建议看一下这篇文章Java内存模型
参考https://blog.csdn.net/suifeng3051/article/details/52611233
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89863.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!