Java多线程---线程同步的三种方法

当多线程并发(指两个或多个事件在同一个时间段内发生)时,容易发生线程不安全的问题,我们希望某一段代码执行的过程中CPU不要切换到其它线程工作,这时就需要同步。

线程同步的目的是为了保护多个线程反问一个资源时对资源的破坏。线程同步方法是通过锁来实现,每个对象都有切仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他非同步方法。

同步代码块

格式:synchronized(锁对象){执行代码块}

synchronized的目的是使同一个对象的多个线程,在某个时刻只有其中的一个线程可以访问这个对象的synchronized 数据。每个对象都有一个“锁标志”,当这个对象的一个线程访问这个对象的某个synchronized 数据时,这个对象的所有被synchronized 修饰的数据将被上锁(因为“锁标志”被当前线程拿走了),只有当前线程访问完它要访问的synchronized 数据时,当前线程才会释放“锁标志”,这样同一个对象的其它线程才有机会访问synchronized 数据。

注意:

  • 锁对象可以是任意的,可以是随意创建一个对象放进去,但是多个线程执行只能是同一个锁对象,当其中一个线程获取锁对象开始执行被锁代码时其余线程只能在外边等待。不能在括号内使用匿名对象(new 对象名),这样多个线程使用的就是多个锁了。
  • 同步代码块不要去嵌套,容易出现死锁。

同步方法

格式:public synchronized void aMethod() {}

同步代码块比较细,可以只给一句代码加锁,而同步方法以方法为单位加锁,同步方法锁定的是调用这个同步方法的对象,就是在方法内部调用的this,但如果这个方法被静态修饰,那么锁对象就是类名.class

注意:

  • 不管是同步代码块还是同步方法,要想达到线程同步的目的,都必须运行的是同一个任务对象。
  • 如果一个对象既有同步方法,又有同步块,那么当其中任意一个同步方法或者同步块被某个线程执行时,这个对象就被锁定了,其他线程无法在此时访问这个对象的同步方法,也不能执行同步块。

显示锁Lock

在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。
ReentrantLock类是可重入、互斥、实现了Lock接口的锁,它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。
ReenreantLock类的常用方法有:

  • ReentrantLock() : 创建一个ReentrantLock实例
  • lock() : 获得锁
  • u
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值