java解决线程同步问题

java解决线程同步问题

synchronized机制与lock机制

synchronized机制

1.同步代码块

synchronized(obj){
	//obj为同步监视器,即锁
	//括号内部放置访问共享的代码段
	//如果多线程采用实现Runable接口方式,obj可以为this对象
	//如果多线程采用继承Thread类方式,obj可以是当前类的**.class对象
}

2.同步方法

public synchronized void func(){
	//同步方法仍然涉及同步监视器,不过是隐式的
	//如果多线程采用实现Runable接口方式,则同步监视器为this对象
	/*如果多线程采用继承Thread类方式,则同步监视器为当前类**.class对象,
	且同步方法必须声明为static方法*/
}

tips:

synchronized机制必须共用同一把锁。
synchronized包含的范围要尽可能合适,范围太大不能发挥多线程优势,范围太小不能锁住所有有安全问题的代码。

lock机制

java.util.concurrent.locks.Lock接口是控制多个线程对共享资源进行访问的
工具。锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象
加锁,线程开始访问共享资源之前应先获得Lock对象。

ReentrantLock 类实现了 Lock ,它拥有与 synchronized 相同的并发性和
内存语义,在实现线程安全的控制中,比较常用的是ReentrantLock,可以
显式加锁、释放锁。

1)实例化ReentrantLock类;
(2)调用实例对象的lock();
(3)调用实例对象的unlock()

synchronized机制与lock机制的比较

  • 相同:二者都可以解决线程安全问题
  • 不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器,Lock需要手动的启动同步(lock(),同时结束同步也需要手动的实现(unlock())

两种方式的选择

Lock ==> 同步代码块 ==> 同步方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值