synchronized(同步):可以对代码块进行加锁,当线程运行到synchronized代码块时,会判断当前代码块是否有其他线程操作,如果当前有其他线程在进行操作则所有线程都需要等待。synchronized保证当前代码块只有一个线程进行操作。当运行到synchronized时,当前线程判断是否有其他线程正在执行,如果没有则进入代码块,并在此时锁上代码块防止其他线程操作,在运行传synchronized所包裹的代码块后,打开锁。
    ————————————————————————————————————-
    synchronized同步代码块:

    • 线程获得锁
    • 清空变量副本
    • 拷贝共享变量最新值到变量副本中
    • 执行代码
    • 将修改后的变量副本中的值赋值给共享数据
    • 释放锁

    变量副本:每个线程第一次执行时都会将内存中的变量值拷贝一份保存到线程栈里
    共享变量:内存中保存的变量值
    ————————————————————————————————————-
    因为synchronized的机制,同时只能有一个线程操作,会降低运行速度,所以又被称为悲观锁

    // 可以定义任何类型的锁,但必须保证每个线程操作的锁都是同一把
    Object obj = new Object;
    synchronized(obj ){
    代码块….
    }

    volatile(可见性):
    volatile关键字:强制线程每次在使用时,都会看一下共享区域的最新的值。
    public static volatile int count = 10;