你知道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的常见问题,请继续关注本站来进行了解吧。
推荐阅读: