网站优化人员,thinkphp官方网站,怎么把抖音关键词做上去,如何评价伊利集团网站建设前言
本来想着给自己放松一下#xff0c;刷刷博客#xff0c;突然被几道面试题难倒#xff01;说一说自己对于 synchronized 关键字的了解#xff1f;说说自己是怎么使用 synchronized 关键字#xff1f;什么是线程安全#xff1f;Vector是一个线程安全类吗#xff1f;…前言
本来想着给自己放松一下刷刷博客突然被几道面试题难倒说一说自己对于 synchronized 关键字的了解说说自己是怎么使用 synchronized 关键字什么是线程安全Vector是一个线程安全类吗volatile关键字的作用似乎有点模糊了那就大概看一下面试题吧。好记性不如烂键盘
说一说自己对于 synchronized 关键字的了解
synchronized关键字解决的是多个线程之间访问资源的同步性synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 另外在 Java 早期版本中synchronized属于重量级锁效率低下因为监视器锁monitor是依赖于底层的操作系统的Mutex Lock 来实现的Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程都需要操作系统帮忙完成而操作系统实现线程之间的切换时需要从用户态转换到内核态这个状态之间的转换需要相对比较长的时间时间成本相对较高这也是为什么早期的synchronized 效率低的原因。 庆幸的是在 Java 6 之后 Java 官方对从 JVM 层面对synchronized 较大优化所以现在的 synchronized 锁效率也优化得很不错了。JDK1.6对锁的实现引入了大量的优化如自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术来减少锁操作的开销。
说说自己是怎么使用 synchronized 关键字
修饰实例方法: 作用于当前对象实例加锁进入同步代码前要获得当前对象实例的锁 修饰静态方法:也就是给当前类加锁会作用于类的所有对象实例因为静态成员不属于任何一个实例对象是类 成员 static 表明这是该类的一个静态资源不管new了多少个对象只有一份。 所以如果一个线程A调用一个实例对象的非静态 synchronized 方法而线程B需要调用这个实例对象所属类的静态 synchronized 方法是允许的不会发生互斥现象因为访问静态 synchronized 方法占用的 锁是当前类的锁而访问非静态 synchronized 方法占用的锁是当前实例对象锁。 修饰代码块: 指定加锁对象对给定对象加锁进入同步代码库前要获得给定对象的锁。 总结 synchronized 关键字加到 static 静态方法和 synchronized(class)代码块上都是是给 Class 类上锁。synchronized关键字加到实例方法上是给对象实例上锁。尽量不要使用 synchronized(String a) 因为JVM中字符串常量池具有缓存功能
什么是线程安全Vector是一个线程安全类吗
如果你的代码所在的进程中有多个线程在同时运行而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的而且其他的变量 的值也和预期的是一样的就是线程安全的。 一个线程安全的计数器类的同一个实例对象在被多个线程使用的情况下也不会出现计算失误。很显然你可以将集合类分成两组线程安全和非线程安全的。 Vector 是用同步方法来实现线程安全的, 而和它相似的ArrayList不是线程安全的。
volatile关键字的作用
一旦一个共享变量类的成员变量、类的静态成员变量被volatile修饰之后那么就具备了两层语义
保证了不同线程对这个变量进行操作时的可见性即一个线程修改了某个变量的值这新值对其他线程来说是立即可见的。 禁止进行指令重排序。 volatile本质是在告诉jvm当前变量在寄存器工作内存中的值是不确定的需要从主存中读取synchronized则是锁定当前变量只有当前线程可以访问该变量其他线程被阻塞住。 volatile仅能使用在变量级别synchronized则可以使用在变量、方法、和类级别的。 volatile仅能实现变量的修改可见性并不能保证原子性synchronized则可以保证变量的修改可见性和原子性。 volatile不会造成线程的阻塞synchronized可能会造成线程的阻塞。 volatile标记的变量不会被编译器优化synchronized标记的变量可以被编译器优化。