synchronized和volatile的具体用法
时间: 2023-05-31 20:02:02 浏览: 62
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。