【多线程】——synchronized关键字

    synchronized是Java中的关键字,意思为同步,通常在Java中用于多线程的场景下,代表着同步锁。可以修饰方法,变量。简单理解如果使用了在方法上或者在代码块上使用代表,无论哪个线程只要每次调用同一个对象并且运行使用synchronized修饰代码都需要验证有没有正在使用这段代码的线程,如果有则需要等其他线程之后完成后才能继续调用。

什么时候需要使用synchronized?

    如果多个线程同时访问同一个对象中实例变量,则由可能出现“非线程安全”问题。非线程安全问题最经典就是车站卖票,本来只有100张票,结果卖个的人数为100+,此时就是多个线程共享一个实例变量造成的问题。

    为了保证线程的安全,引入synchronized,当多个线程同时操作一个实例变量的时候排序依次进行操作,这样就不会出现多个线程同时操作的情况,线程此时是安全的。

注意:只有涉及到共享资源的读写才需要同步化

synchronized使用方式

1、类锁

synchronized修饰带有static的方法,或者同步代码块中括号中内容为class的时候是类锁,针对该类的所有实例化对象的线程都有作用,排队进行。每个实例化对象直接需要排队进行。

  synchronized public static void test() {
        System.out.println("我是类锁");
    }
public void classLock() {
    synchronized (LockClass.class) {
        System.out.println("我是类锁");
    }
}

2、对象锁

synchronized修饰普通方法或者变量都是对象锁,仅针对使用该对象的线程需要排队。

 synchronized public void objectFunctionLock() {
        System.out.println("我是普通方法对象锁");
    }

    private Object object = new Object();
    public void objectVariableLock() {
        synchronized (object) {
            System.out.println("我是变量对象锁");
        }
    }

3、同步不具有继承性

4、支持可重入锁

    当一个线程得到一个对象锁后,再次请求此对象锁时可以再次得到该对象的锁,就是一个线程中多个锁方法连续调用,依旧可以获得锁,即为可重入锁。可重入锁支持父子继承关系中。

5、同步代码块

    当一个方法中有同步代码块,此方法支持一部分异步,加锁的一部分同步,这样可以缓解一部分因为同步锁造成的运行时间缓慢的问题,只在需要的地方才加同步代码块。

6、synchronized(this)和synchronized(非this)

    这一部分看到很多人都在纠结,其实很简单括号中放的是什么对象就锁住什么对象,this就是当前对象本身,非this就是自身以外的其他内容,可能就是成员变量之类的内容。只要成员变量指向的位置不发生变化,里面的属性随便变,都不影响当前对象当做锁来使用。

总结

    好好的去理解,去实践,远比想象中的简单很多!

猜你喜欢

转载自blog.csdn.net/jiadajing267/article/details/80592158