synchronized()锁全局变量
时间: 2023-10-22 07:07:58 浏览: 82
使用`synchronized`关键字可以对对象进行加锁,从而保证同一时间只有一个线程可以访问被锁定的代码块。如果你使用`synchronized`锁全局变量,意味着所有线程在访问该变量时都必须先获取该变量的锁,这会导致所有线程在访问该变量时都会被阻塞,直到拥有该锁的线程释放锁为止。因此,锁全局变量可能会导致程序的性能下降,并且容易引起死锁等问题。一般来说,应该尽量避免锁全局变量,而是使用更细粒度的锁,例如针对某个对象或某个方法进行加锁。
相关问题
android 全局变量
在 Android 中,全局变量的最佳实践是使用单例模式。单例模式是一种设计模式,它确保类只有一个实例,并提供了一个全局访问点。
以下是一个示例:
```java
public class MySingleton {
private static MySingleton instance;
private String myVariable;
private MySingleton() {
// 私有构造函数,确保只能通过getInstance()方法获取实例
}
public static synchronized MySingleton getInstance() {
if (instance == null) {
instance = new MySingleton();
}
return instance;
}
public String getMyVariable() {
return myVariable;
}
public void setMyVariable(String myVariable) {
this.myVariable = myVariable;
}
}
```
在上面的示例中,MySingleton 类只有一个实例。可以通过调用 `getInstance()` 方法获取该实例,并使用 `setMyVariable()` 和 `getMyVariable()` 方法设置和获取全局变量 `myVariable`。
使用单例模式可以确保全局变量的唯一性,并且可以在应用程序中的任何位置方便地使用该变量。
1)定义一个全局变量 count, 创建两个线程1和2;线程1读取全局变量 count的值到局部变量a, 局部变量a加10后重新赋值给 count; 线程2读取全局变量 count的值到局部变量b, 局部变量b加20后重新赋值给 count。
这种场景通常涉及到竞态条件(Race Condition),在多线程环境下,由于对共享资源(全局变量count)的并发访问可能导致数据不一致。当两个线程几乎同时读取、修改并写回count的值时,可能会出现意外的结果。这里的关键在于同步机制,以防止数据冲突。
以下是简化的伪代码描述:
```java
// 定义全局变量 count,假设初始值为0
volatile int count = 0;
// 线程1
Runnable thread1 = () -> {
int a = count; // 读取值
synchronized (this) { // 使用锁来保证同步
a += 10;
count = a; // 更新值
}
};
// 线程2
Runnable thread2 = () -> {
int b = count; // 读取值
synchronized (this) { // 使用相同的锁进行同步
b += 20;
count = b; // 更新值
}
};
Thread t1 = new Thread(thread1);
Thread t2 = new Thread(thread2);
t1.start();
t2.start();
// 等待两个线程结束
t1.join();
t2.join();
```
在这个例子中,`synchronized`关键字用于锁定当前对象(即每个线程自身),确保了同一时间只有一个线程可以访问临界区(更新count)。但是需要注意的是,这种方式并不能完全避免数据竞争,因为这两个线程依然可能会交替执行,导致最终结果可能不是期望的50。如果需要精确控制结果,可能需要更复杂的同步机制,如使用互斥量(mutex)或原子操作等。