Sychonize用法

通用用法

Java每个对象都可以作为锁
1. 普通同步方法,锁的是当前实例对象
2. 静态同步方法,锁的是当前class对象
3. 同步代码块,锁的是括号中的对象

扩展
1. 不同对象的多线程是可以同时访问同一个synchronized方法(保护同一个对象的方法调用)
2. 不同的两个线程,可以其中1个访问sync保护的静态方法,另一个访问sync保护的实例方法。
保护的对象不同:

  • 静态方法 ==> class类对象
  • 实例方法 ==> this 实例对象

等待通知机会

static Object lock = new Object()
sychronized(lock){
    lock.wait();
}

sychronized(lock){
    lock.notify();
}

特点

sychronized具备可重入性
sychronized具备内存可见性(可用volitale替代)
sychronized是重量级锁

底层简介

语义底层是通过一个monitor监视对象来实现的。
wait和notify等方法也是依赖于monitor对象。
监视器锁(monitor)的本质依赖于底层操作系统的互斥锁(Mutex Lock)实现。
sychronized在异常时主动释放锁,而Lock在异常时需要手动释放锁。

常见问题

  1. 线程到队列取任务,如何保证同时只有一个取得任务。
    (1) 静态共享变量
    (2) 线程锁的时候sychronized(object)即可。
  2. 如何保证任务A执行完了才执行B
    (1) 共享变量控制状态
    (2) 线程join(),等待线程执行完了才继续执行。
    (3) wait() and notify()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值