多线程第二章

gushilcy / 2023-07-19 / 原文

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);
            }
        }
    }
}