Synchronized关键字用一句话来解释其作用就是:能够保证同一时刻最多只有一个线程执行该段代码,以达到并发安全的效果。也就是说Synchronized就好比是一把锁,某个线程把资源锁住了之后,别人就不能使用了,只有当这个线程用完了别人才能用。
对于Synchronized关键字来说,它是并发编程中一个元老级角色,也就是说你只要学习并发编程,就必须要学习Synchronized关键字。由此可见其地位。
说了这么多,好像我们还没体验过它的威力。我们就直接举个例子,来分析一下。
public class SynTest01 implements Runnable{
static int a=0;
public static void main(String[] args)
throws InterruptedException {
SynTest01 syn= new SynTest01();
Thread thread1 = new Thread(syn);
Thread thread2 = new Thread(syn);
thread1.start();thread1.join();
thread2.start();thread2.join();
System.out.println(a);
}
@Override
public void run() {
for(int i=0;i<1000;i++) {
a++;
}
}
}
上面代码要完成的功能就是,thread1对a进行增加,一直到1000,thread2再对a进行增加,一直到2000。不过如果我们运行过之后我们就会发现,最后的输出值总是小于2000,这是为什么呢?
这是因为我们在执行a++的时候其实包含了以下三个操作:
1.线程1读取a
2.线程1将a加1
3.将a的值写入内存
出错原因的关键就在于第二操作和第三个操作之间,此时线程1还没来得及把a的值写入内存,线程2就把旧值读走了,这也就造成了a加了两次,但是内存中的a的值只增加了1。这也就是不同步现象。
但是如果说我们使用了Synchronized关键字之后呢?
public class SynTest01 implements Runnable{
static int a=0;
Object object = new Object();
public static void main(String[] args) throws InterruptedException {
SynTest01 syn= new SynTest01();
Thread thread1 = new Thread(syn);
Thread thread2 = new Thread(syn);
thread1.start();thread1.join();
thread2.start();thread2.join();
System.out.println(a);
}
@Override
public void run() {
synchronized (object) {
for(int i=0;i<1000;i++) {
a++;
}
}//结束
}
}
现在我们使用synchronized关键字把这一块代码锁住,不管你怎么输出都是2000了,锁住之后,同一时刻只有一个线程进入。也就不会发生上面a写操作不同步的现象了。
现在相信你开始觉得synchronized关键字的确很实用,可以解决多线程中的很多问题。上面这个小例子只是带我们去简单的认识一下,我们可以参考动力节点在线的视频课程中举出的更多的例子,加深我们对synchronized关键字的理解。
提枪策马乘胜追击04-21 20:01
代码小兵92504-17 16:07
代码小兵98804-25 13:57
杨晶珍05-11 14:54