美文网首页
Synchronized

Synchronized

作者: 米_8d62 | 来源:发表于2020-02-08 16:24 被阅读0次

    Synchronized的作用主要

    (1)确保线程互斥的访问同步代码
    (2)保证共享变量的修改能够及时可见
    (3)有效解决重排序问题。

    Synchronized的基本使用

    1. 修饰普通方法
      当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。Java中的每个对象都有一个锁(lock),或者叫做监视器(monitor),当一个线程访问某个对象的synchronized方法时,将该对象上锁,其他任何线程都无法再去访问该对象的synchronized方法了(这里是指所有的同步方法,而不仅仅是同一个方法),直到之前的那个线程执行方法完毕后(或者是抛出了异常),才将该对象的锁释放掉,其他线程才有可能再去访问该对象的synchronized方法
    2. 修饰静态方法
      如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的类所对应的Class对象。Java中,无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,它们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始。
    3. 修饰代码块
      synchronized方法是一种粗粒度的并发控制,某一时刻,只能有一个线程执行该synchronized方法;synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内、synchronized块之外的其他代码是可以被多个线程同时访问到的

    Synchronized 原理

    package thread.pool;
    
    public class SynchronizedDemo {
        public void method() {
            synchronized (this) {
                System.out.println("Method 1 start");
            }
        }
    }
    
    代码块

    结果:
    代码块加锁就是在方法中定义monitor对象,通过对monitor值判断来得出是否具有操作权限。

    package thread.pool;
    
    public class SynchronizedDemo {
        public synchronized void method() {
             System.out.println("Method 1 start");
        }
    }
    
    普通方法

    结果:
    在常量池中加入ACC_SYNCHRONIZED标示符,判断标识符是否存在来得出是否具有操作权限。

    相关文章

      网友评论

          本文标题:Synchronized

          本文链接:https://www.haomeiwen.com/subject/ffhixhtx.html