synchronized意思是什么?是什么意思?

KLQ 2020-06-05 09:57:02 java常见问答 5177

你知道synchronized吗?在java当中,synchronized又是什么意思呢?下面就和小编一起来深入的了解一下synchronized的含义吧。

synchronized关键词,代表着这个方法加锁,也就是好比不论是哪一个线程,例如,线程A,在运行到这个方法的时候,都要检查,有没有其他的线程,例如线程B,正在用这个方法,又或者是,这个类的其他同步方法。

假如有的话,那么就要等待正在使用synchronized方法的线程B将这个方法运行完之后,再去运行这个线程A。

假如,是没有的话,那么就锁定调用者,之后再直接运行。

它一共包括了两种用法,分别是synchronized方法和synchronized块。

java语言的关键字能够用来给对象和方法,又或者是代码块加锁。

在它锁定一个方法又或者是锁定一个代码块的时候,在同一个时刻,最多就只有一个线程执行这一段代码。

在两个并发线程对同一个对象object当中的这个加锁同步代码块进行访问的时候,在一个时间之内,就只可以有一个线程得到执行。

另外一个线程,就一定要等到这个线程执行完这个代码块之后,才能够执行这个代码块。

但是,在一个线程对object的一个加锁代码块进行访问的时候,那么另外一个线程是依旧可以访问这个object当中的非加锁代码块的。

synchronized方法

synchronized后面括号里是类,这个时候,线程获得的是对象锁。

例如:

classArrayWithLockOrder
{
    private static long num_locks = 0;
    private long lock_order;
    private int[] arr;
    public ArrayWithLockOrder(int[] a)
    {
        arr = a;
        synchronized(ArrayWithLockOrder.class)
        { //-----这里
            num_locks++; //锁数加1。
            lock_order = num_locks; //为此对象实例设置唯一的lock_order。
        }
    }
    publiclonglockOrder()
    {
        returnlock_order;
    }
    public int[] array()
    {
        return arr;
    }
}
class SomeClass implements Runnable
{
    public int sumArrays(ArrayWithLockOrdera1, ArrayWithLockOrdera2)
    {
        intvalue = 0;
        ArrayWithLockOrderfirst = a1; //保留数组引用的一个
        ArrayWithLockOrderlast = a2; //本地副本。
        intsize = a1.array()
            .length;
        if (size == a2.array()
            .length)
        {
            if (a1.lockOrder() > a2.lockOrder())
            { //确定并设置对象的锁定顺序。
                first = a2;
                last = a1;
            }
            synchronized(first)
            { //按正确的顺序锁定对象。
                synchronized(last)
                {
                    int[] arr1 = a1.array();
                    int[] arr2 = a2.array();
                    for (int i = 0; i < size; i++)
                        value += arr1[i] + arr2[i];
                }
            }
        }
        return value;
    }
    public void run()
    {
        //
    }
}

关于synchronized你都了解了吗?更多关于synchronized的常见问题,请继续关注本站来进行了解吧。

推荐阅读:

Synchronized及其实现原理有哪些?

sychronized和reentrantlock区别在哪里?都有什么用处?

java中synchronized的用法具体怎么使用?