synchronized原创
# synchronized对象监视器为Object时的使用
private int count = 10;
private Object object = new Object();
public void m() {
synchronized (object) {
count--;
System.out.println(Thread.currentThread().getName() + "count = " + count);
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# synchronized
对象监视器为Class时的使用
public class Test1 {
private int count = 10;
public static void m() {//这里是静态方法
synchronized (Test1.class) {//这里可以使用this吗?
count--;
System.out.println(Thread.currentThread().getName() + "count = " + count);
}
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
在非静态代码块的情况下,可以使用this锁
public class Test1 {
private int count = 10;
public void m() {
synchronized (this) {//这里可以使用this
count--;
System.out.println(Thread.currentThread().getName() + "count = " + count);
}
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
以上代码简化写法
public class Test1 {
private int count = 10;
public synchronized void m() {
count--;
System.out.println(Thread.currentThread().getName() + "count = " + count);
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
分析这个程序输出
线程重入问题
public class T implements Runnable{
private int count = 10;
@Override
public void run() {
count--;
System.out.println(Thread.currentThread().getName() + "count = " + count);
}
public static void main(String[] args) {
T t =new T();
for (int i = 0; i< 5; i++){
new Thread(t, "THREAD" + i ).start();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在同步代码块中,不要出现异常,否则会释放锁,会出现异常数据,可以用try catch 捕获异常,进行事务处理
编辑 (opens new window)
上次更新: 2022/05/01, 19:42:49