volatile 和 void用法区别
时间: 2023-04-09 11:03:58 浏览: 101
Volatile 和 void 是两个不同的概念。Void 是一种数据类型,表示没有返回值的函数或方法。而 volatile 是一种关键字,用于修饰变量,表示该变量可能会被多个线程同时访问,因此需要特殊处理以保证线程安全。具体来说,使用 volatile 修饰的变量会被存储在主内存中,而不是线程的本地内存中,这样可以保证多个线程对该变量的访问是同步的。
相关问题
synchronized和volatile的具体用法
synchronized和volatile是Java中用于实现多线程编程的关键字。它们的具体用法如下:
synchronized:
synchronized用于保证多线程访问共享资源的同步性,可以用在方法或代码块上。
1. 用在方法上:
synchronized修饰的方法在同一时刻只能被一个线程访问,其他线程必须等待当前线程执行完毕才能访问该方法。
示例:
```
public synchronized void doSomething(){
// 方法体
}
```
2. 用在代码块上:
synchronized修饰的代码块在同一时刻只能被一个线程访问,其他线程必须等待当前线程执行完毕才能访问该代码块。代码块的锁对象可以是任意对象。
示例:
```
public void doSomething(){
synchronized(this){
// 代码块
}
}
```
volatile:
volatile用于保证多线程之间的可见性,即一个线程修改了变量的值,其他线程能够立即看到这个变化,也就是说,多个线程对于同一个volatile变量的读和写操作是互相可见的。
示例:
```
public class VolatileTest {
private volatile int count = 0;
public void increase() {
count++;
}
public static void main(String[] args) {
final VolatileTest test = new VolatileTest();
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
for (int j = 0; j < 1000; j++) {
test.increase();
}
}
}).start();
}
while (Thread.activeCount() > 1) { // 等待所有线程执行完毕
Thread.yield();
}
System.out.println(test.count);
}
}
```
上述代码中,count变量被声明为volatile,保证了多个线程对于count的读和写是可见的,最终输出的结果应该是10000。如果不使用volatile修饰count变量,则多个线程对于count的读和写是不可见的,最终输出的结果可能小于10000。
synchronized和volatile的用法
synchronized和volatile是Java中用于多线程编程的关键字,它们的用法如下:
1. synchronized
synchronized用于保证多个线程访问共享资源时的线程安全,它有两种用法:
(1) 同步方法:将方法声明为synchronized,可以保证同一时刻只有一个线程可以访问该方法。
```java
public synchronized void method() {
// 该方法的代码只有一个线程可以执行
}
```
(2) 同步代码块:将需要同步的代码块用synchronized包围起来,可以保证在同一时刻只有一个线程可以执行该代码块。
```java
public void method() {
synchronized(this) {
// 该代码块的代码只有一个线程可以执行
}
}
```
2. volatile
volatile用于保证多个线程访问共享变量时的可见性,即当一个线程修改了共享变量的值时,其他线程能够立即看到该变量的最新值。volatile有如下用法:
(1) 修饰变量:将需要保证可见性的变量声明为volatile。
```java
public volatile int count;
```
(2) 禁止指令重排序:在多线程环境下,JVM可能会对代码进行指令重排序,而volatile可以禁止指令重排序。
```java
public volatile int count;
public void method() {
count = 1;
// 禁止指令重排序
synchronized(this) {
// 该代码块的代码只有一个线程可以执行
}
}
```