多线程第二章
synchronized锁
synchronize是java的关键字,放在不同的位置锁住的代码不同
Synchronized
1,线程安全性出现的原因
jvm中线程工作分为主内存和工作内存
如何和主内存的数据同步,产生的数据不一致性,就是我们常说的线程安全,这就需要我们去了解Java内存模型了
uploading-image-879490.png
如图为JMM抽象示意图,线程A和线程B之间要完成通信的话,要经历如下两步:
- 线程A从主内存中将共享变量读入线程A的工作内存后并进行操作,之后将数据重新写回到主内存中;
- 线程B从主存中读取最新的共享变量。
synchronized的字面意思,是同步的意思。
在多线程访问某行代码的时候,synchronized可以用来控制线程的同步,简单的说就是控制synchronized代码段不被多个线程同时执行,使其有序执行。
2,用法
synchronized写在方法或者代码块中
当前
/**
* @auth lcy
* @date 2023/4/1216:18
* @Version 1.0
* @Desc 方法锁,适用于只有一个对象实例时,多个线程访问时保证线程安全
* 当有多个SyncExample1 对象实例时,多个线程访问,创建了多个锁(多对象多锁)
*/
public class SyncExample1 {
private int num = 0;
synchronized public void addI(String username) {
try {
if (username.equals("a")) {
num = 100;
System.out.println("a set over!");
Thread.sleep(2000);
} else {
num = 200;
System.out.println("b set over!");
}
System.out.println(username + " num=" + num);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
* 锁在代码块中
*/
public void test1(int j) {
synchronized (this) {
for (int i = 0; i < 10; i++) {
log.info("test1 {} - {}", j, i);
}
}
}
}