synchronized()括号的参数
时间: 2024-05-28 12:04:18 浏览: 34
synchronized()括号的参数是一个对象或类的实例。这个对象或类的实例被用作锁,以确保在同一时间只有一个线程可以访问被锁定的同步代码块或方法。当一个线程进入同步代码块或方法时,它会尝试获取锁定对象的锁。如果锁定对象已被其他线程锁定,则线程将阻塞等待锁定对象的锁被释放。只有当线程成功获取锁定对象的锁时,它才能执行同步代码块或方法。
相关问题
synchronized的括号里的是什么
`synchronized`关键字后面通常跟着一个括号,括号里的内容可以是一个对象、this关键字或者是当前线程。这是用来确定锁的范围以及锁定机制的关键部分:
- **对象锁**:如果传递一个具体的对象作为参数,那么只有拥有这个对象实例的监视器锁的线程才能进入同步代码块。这意味着整个代码块对于所有持有该对象的其他线程来说都是不可见的。
```java
synchronized (obj) {
// 对象 obj 的代码块
}
```
- **this关键字锁**:如果使用`this`,则锁定的是当前对象实例,适用于成员变量共享的情况,确保对它们的修改是线程安全的。
```java
public class MyClass {
private Object lock = new Object();
synchronized (this) {
// 当前对象的代码块
}
}
```
- **当前线程锁**:当没有提供参数时,`synchronized`作用于当前的Thread对象,这被称为隐式监视器锁。这种方式下,所有来自同一个线程的同步代码块都会互斥执行。
```java
synchronized (null) { // 等价于 synchronized (Thread.currentThread()) {
// 当前线程的代码块
}
```
总之,括号中的内容决定了锁定的对象,进而控制了哪些线程能够同时执行同步代码块内的代码。
synchronized 非公平锁
synchronized关键字在默认情况下是非公平锁。非公平锁指的是当多个线程竞争同一个锁时,锁的获取是不按照线程的请求顺序进行的,而是由操作系统的调度决定的。这意味着,即使一个线程已经等待了很长时间,也不能保证它会优先获得锁。[1]
需要注意的是,synchronized关键字也可以使用公平锁。公平锁指的是当多个线程竞争同一个锁时,锁的获取是按照线程的请求顺序进行的,先到先得。在synchronized关键字中使用公平锁需要在获取锁的地方添加一个参数,即synchronized关键字后面的括号中加上"true"。例如:synchronized(obj, true)。[1]
总结来说,synchronized关键字默认情况下是非公平锁,但也可以使用公平锁。非公平锁的获取顺序由操作系统的调度决定,而公平锁的获取顺序是按照线程的请求顺序进行的。[1]
阅读全文