synchronized关键字:多线程资源访问同步性与早期效率低下原因,国内seo贰金手指六六二四
2025-03-31 00:00:00 浏览:
目录
1.1 说一说自己对于 关键字的了解
关键字的作用是解决多个线程访问资源的同步性问题。它能够确保被其修饰的方法或者代码块在任何时刻都只能有一个线程执行。
在 J*a 的早期版本里,它属于重量级锁,效率较为低下。这是因为监视器锁()是依靠底层的操作系统的 Mutex Lock 来实现的,并且 J*a 的线程是映射在操作系统的原生线程之上的。要挂起或者唤醒一个线程,都得依靠操作系统来帮忙完成。操作系统在实现线程之间的切换时,需要从用户态转换到内核态。这种状态之间的转换需要花费相对较长的时间,且时间成本较高。这就是早期效率低的原因所在。庆幸的是,在 J*a 6 之后,J*a 官方从 JVM 层面进行了较大优化。所以现在的锁效率优化得很不错了。JDK1.6 对锁的实现引入了诸多优化,像自旋锁、适应性自旋锁、锁消除、锁粗化、偏向锁、轻量级锁等技术,这些技术能减少锁操作的开销。
1.2 说说自己是怎么使用 关键字,在项目中用到了吗
关键字最主要的三种使用方式:
下面我已一个常见的面试题为例讲解一下 关键字的具体使用。
面试时面试官常常会问:“你了解单例模式吗?请给我手写一下单例模式!给我讲讲用双重检验锁方式实现单例模式的原理吧!”
双重校验锁实现对象单例(线程安全)
<p style='margin-bottom:15px;color:#555555;font-size:15px;line-height:200%;text-indent:2em;'> <pre class="has"><code class="language-j*a">public class Singleton {
private 类型的变量 uniqueInstance 是 volatile 的且为 static 的,它是 Singleton 类型的单例对象。
private Singleton() {
}
public static Singleton 获取唯一实例() {
先判断对象是否已经被实例化过,如果没有被实例化过,才进入加锁代码。
如果 uniqueInstance 为 null ,那么 ;如果 uniqueInstance 不为 null ,则 。
//类对象加锁
对 Singleton.class 进行同步操作。
如果 uniqueInstance 为 null ,那么 ;如果 uniqueInstance 不为 null ,则不执行此条件判断 。
Singleton 类创建了一个名为 uniqueInstance 的实例。
}
}
}
返回唯一实例。
}
}
</code></pre></p>
另外,需要注意 采用 关键字修饰也是很有必要。
使用关键字进行修饰是很有必要的。这段代码实际上是分三步来执行的:第一步,进行某个操作;第二步,执行另一个动作;第三步,完成最后的步骤。
友情链接: