Java多线程4:synchronized的使用场景和原理简介 | 您所在的位置:网站首页 › sleep会导致线程切换吗 › Java多线程4:synchronized的使用场景和原理简介 |
前言:synchronized是Java中的关键字,是一种同步锁,用来完成多线程条件下同步工作的。只有拿到锁的线程才能执行synchronized修饰的方法或代码块,且其他线程获得锁的唯一方法是等目前拿到锁的线程执行完方法将锁释放,如果synchronized修饰的代码块或方法没执行完是不会释放这把锁的,这就保证了拿到锁的线程可以一次性把它调用的方法或代码块执行完。 一、synchronized使用 1.1 、synchronized介绍在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。 在Java1.5中,synchronize是性能低效的。因为这是一个重量级操作,需要调用操作接口,导致有可能加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高一些。 但是到了Java1.6,发生了变化。synchronized在语义上很清晰,可以进行很多优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。导致在Java1.6上synchronized的性能并不比Lock差。官方也表示,他们也更支持synchronized,在未来的版本中还有优化余地。 synchronized可以修饰普通方法,静态方法和代码块。当synchronized修饰一个方法或者一个代码块的时候,它能够保证在同一时刻最多只有一个线程执行该段代码。 对于普通同步方法,锁是当前实例对象(不同实例对象之间的锁互不影响)。 对于静态同步方法,锁是当前类的Class对象。 对于同步方法块,锁是Synchonized括号里配置的对象。 当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。 1.2 、使用场景synchronized最常用的使用场景就是多线程并发编程时线程的同步。这边还是举一个最常用的列子:多线程情况下银行账户存钱和取钱的列子。 public class SynchronizedDemo { public static void main(String[] args) { BankAccount myAccount = new BankAccount("accountOfMG",10000.00); for(int i=0;i |
CopyRight 2018-2019 实验室设备网 版权所有 |