Synchronized 用过吗,其原理是什么
Synchronized 是 Java 中用于实现同步的关键字,它可以用于方法和代码块。Synchronized 的原理是,它会使用对象的内置锁(也称为监视器锁)来实现同步,每个对象都有一把内置锁,当一个线程访问一个同步代码块时,它会尝试获取这个锁,如果锁被其他线程持有,则该线程将被阻塞,直到锁被释放。
Synchronized 有以下几个特点:
1. 互斥性:Synchronized 保证同一时刻只有一个线程可以获取锁,并且只有该线程可以执行同步代码块中的代码。
2. 可重入性:同一个线程可以多次获取同步锁而不会被阻塞,这样可以避免死锁的发生。
3. 独占性: 如果一个线程获得了对象的锁,则其他线程必须等待该线程释放锁之后才能获取锁。
4.缺点:非公平锁 ,当锁被释放后,任何一个线程都有机会竞争得到锁,这样做的目的是提高效率,但缺点是可能产生线程饥饿现象。
除了使用 Synchronized 关键字之外,Java 还提供了一些其他的同步机制,例如 ReentrantLock、Semaphore、CountDownLatch 等。在选择同步机制时,需要根据具体的应用场景和需求来选择合适的同步方式。
synchronized 的作用?
在Java中,synchronized 关键字是用来控制线程同步的,
在多线程的环境下,控制synchronized 代码段不被多个线程同时执行
synchronized 既可以加在一段代码上,也可以加在方法上
synchronized 和 lock 区别?
类别 | synchronized | lock |
---|---|---|
存在层次 | Java 关键字,JVM层面 | 是一个类 |
锁的释放 | JVM将确保锁会获得自动释放 | lock必须在finally块中释放 |
锁状态 | 无法判断 | 可以判断 |
锁性能 | 可重入,不可中断、非公平 | 可重入、可判断、可公平(两者皆可默认非公平) |
性能 | 少量同步 | 大量同步 |
synchronized是重量级锁还是轻量级锁?
synchronized是重量级锁(Heavyweight Lock)。
在Java中,锁有不同的实现方式,包括重量级锁、轻量级锁和偏向锁。synchronized在多线程同步中通常使用的是重量级锁。
重量级锁的实现涉及到操作系统层面的线程调度和内核态与用户态之间的切换,因此它的性能开销相对较大。在多线程竞争激烈的情况下,重量级锁可能导致性能下降,因为线程需要频繁地切换到内核态进行锁的申请和释放。
轻量级锁和偏向锁是Java虚拟机为了提高synchronized性能而引入的优化机制。这些锁会根据竞争情况自动升级或降级为重量级锁。
总之,synchronized 通常是重量级锁,它确保了多线程访问的互斥性,但在高并发情况下,性能开销较大。 Java虚拟机会根据实际情况尝试使用轻量级锁和偏向锁来提高性能。
synchronized是重入锁吗?
是的,synchronized 是一个重入锁(Reentrant Lock)。
重入锁是指允许同一个线程多次获得同一个锁,而不会因为重复获取锁而被阻塞。这种机制被称为锁的重入性。
在Java中,synchronized 具有重入性,这意味着如果一个线程已经获得了某个对象上的锁,那么它可以多次进入被锁定的代码块,而不会被阻塞。这是通过在每个锁对象上维护一个锁计数器来实现的。每次线程获取锁时,计数器加一,释放锁时,计数器减一。只有当计数器归零时,锁才会完全释放,其他线程才能获取该锁。