JAVA线程4 多线程同步

同步与异步?

同步:在多线程中经常会碰到数据的共享问题,即当多个线程访问同一个资源时,需要以某种顺序来确保该资源在某一时刻只能被一个线程使用。

要想实现同步操作,必须要获得每一个线程对象的锁。保证在同一时刻只有一个线程能够进入临界区(访问互斥资源的代码块),并且在这个锁被释放之前,其他线程就不能进入该临界区。

异步和非堵塞类似,由于每个线程都包含了运行时自身所需要的数据或方法,因此在进行输入输出时,不必关心其他线程的状态或行为。

 

多线程同步的方式有哪些?

1.使用synchronized关键字来实现同步

synchronized锁的不是代码,锁的都是对象

根据获取的锁的分类:获取对象锁和获取类锁

获取对象锁的两种用法

1.同步代码块:锁的是小括号中的实例对象

2.同步非静态方法:锁的是当前对象的实例对象

获取类锁的两种用法

1.同步代码块:锁的是小括号中的类对象

2.同步静态方法:锁的是当前对象的类对象

 

2.wait()和notify()方法

当synchronized代码被执行期间,可以使用对象的wait()方法释放锁,进入等待状态,并且调用notify()或notifyAll()方法通知正在等待的其他线程。notify()方法唤醒一个线程并允许它去获得锁。notifyAll()方法唤醒所有等待线程,允许它们竞争去获得锁。

3.Lock

JDK5新增了Lock接口以及它的一个实现类ReentrantLock(重入锁),Lock也可以用来实现多线程的同步。

lock()。以阻塞的方式获取锁(获得锁立即返回;如果别的线程持有锁,一直等待,直到拿到锁)

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

tryLock(long timeout,TimeUnit unit)。如果获取了锁,立即返回true,否则等待timeout时间,期间获取到锁,返回true,否则返回false.

使用:

Final Lock lock = new ReentrantLock();

lock.lock();

..........加锁代码

lock.unlock();

公平锁:

线程是按照获取锁的顺序执行的

非公平锁:

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值