背景
现在可以多个线程对同一片存储空间进行访问,这时存储空间里面的数据叫做共享数据。线程并发给我们带来效率的同时,也带了一些数据安全性的问题,数据安全性是一个很严重的问题,多个线程同时访问同一片数据区,很有可能把里面的数据弄的混乱。 所以Java语言提供了专门机制以解决这种数据安全性问题,有效避免了同一个数据对象被多个线程同时访问,从而导致数据的错乱的问题。
synchronized关键字用法
synchronized关键字可以作为函数的修饰符(也就是常说的同步方法)
synchronized关键字可以作为函数内的语句(也就是常说的同步代码块)
public class AsyncTest {
public void startTest(){
new Thread(new Runnable() {
@Override
public void run() {
int count = 0;
while (count++<10){
printX("A", count);
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
int count = 100;
while (count++<110){
printX("B", count);
}
}
}).start();
}
private synchronized void printX(String flag, int x){
System.out.println(flag + " : x == " + x);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
使用 synchronized 关键字,每次得到的结果都是不同的,而且耗时也达到了20s
image.png
image.png
而去掉 synchronized 关键字的运行结果是固定的,如下,而且耗时也固定为10s
image.png
怎么样,你悟到了没有?
网友评论