多线程同步的实现方法有哪些?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JingLisen/article/details/84999242

个人博客:小景哥哥

Java主要提供了3种实现同步机制

①synchronized关键字

​ 在Java语言中,每个对象都有一个对象锁与之相关联,该锁表明对象在任何时候只允许被一个线程所拥有,当一个线程调用对象的一段synchronized代码时,需要先获取这个锁,然后去执行相应的代码,执行结束后,释放锁。synchronized关键字有两种用法,synchronized方法和synchronized块。该关键字还可以作用于静态方法、类或某个实例。

​ synchronized方法,在方法的声明前加入synchronized关键字。

​ synchronized块,既可以把任意的代码段声明为synchronized,也可以指定上锁的对象,有非常的灵活性。

②volatile关键字

​ volatile关键字为域变量的访问提供了一种免锁机制, 使用volatile修饰域相当于告诉JVM该域可能会被其他线程更新, 因此每次使用该域就要重新计算,而不是使用寄存器中的值,volatile不会提供任何原子操作,它也不能用来修饰final类型的变量。

③Lock

​ JDK5新增加了Lock接口以及它的一个实现类ReentranLock,Lock也可以用来实现多线程的同步。

​ ❶lock()。以阻塞的方式获取锁,如果获取到了锁,立即返回;如果别的线程持有锁,当前线程等待,直到获取锁后返回。

扫描二维码关注公众号,回复: 4500689 查看本文章

​ ❷tryLock()。以非阻塞的方式获取锁。只是尝试性地去获取一下锁,如果获取到锁,立即返回true,否则,立即返回false。

​ ❸tryLock(long timeout, TimeUnit unit)。如果获取了锁,立即返回,否则会等待参数给定的时间单元,在等待的过程中,如果获取了锁,就返回true,如果等待超时,返回false。

​ ❹lockInterruptibly()。如果获取了锁,立即返回,如果没有获取锁,当前线程处于休眠状态,直到获得锁,或者当前线程被别的线程中断(会受到InterruptedException异常)。它与lock()方法最大的区别在于如果lock()方法获取不到锁,会一直处于阻塞状态,且会忽略interrupt()方法。

猜你喜欢

转载自blog.csdn.net/JingLisen/article/details/84999242