Synchronized的作用
没找到官方的说明,说说个人理解。防止在多线程下,多个线程同时对一个共享变量(数据)操作导致冲突。
原理
创建一个相对对象唯一的钥匙,然后用锁把所有可以修改数据的代码锁起来,只有这把钥匙能开锁(就是字面意思。只有拿到钥匙才能打开锁执行里面的代码)。
我一直有误解
网上很多类似的介绍
在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。
然后贴出一个只有一个被synchronized修饰的代码块或方法的示例类。没有错,但是容易误解,我就误解了好久。我以为只能针对这一个代码块。
synchronized (lock) {
....
}
我错了,上面是一个常见的互斥代码块。只要lock对象是同一个,那么所有'{}'包裹的代码块都是互斥的;如下代码
public class Test {
//创建一个临时的对象吧
private Integer lock = new Integer("0");
public void a() {
synchronized (lock) {
lock = lock + 1;
}
}
public void b() {
synchronized (lock) {
lock = lock + 2;
}
}
public void c() {
synchronized (lock) {
lock = lock + 3;
}
}
public void d() {
synchronized (lock) {
lock = lock + 4;
}
}
}
a()、b()、c()、d()函数里的代码块都是互斥的;同一时间只能有一个被执行。
synchronized (lock) {... }
这段代码可以理解为:我要拿到lock对象的钥匙(一个对象只有一把钥匙)打开锁去执行里面的代码块。既然钥匙只要一把那么这些代码块就不可能同时被执行,只要我们把会修改数据的代码块都加入到synchronized (lock) {}
中就可以达到避免多线程操作冲突的目的
Synchronized的使用场景
image还是上面的模式,只是写法略微不同 ;1、锁住的对象 2、大括号里的代码块
网友评论