线程2
Posted wsjun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程2相关的知识,希望对你有一定的参考价值。
一,线程的生命周期
二,如何处理线程的安全问题:售票时重票,0号票 -1号票
原因:一个线程再操作共享数据的时,未执行完,另外的线程参与进来,导致共享数据存在了安全问题。
解决方法:java的同步机制:必须让一个线程操作共享数据完毕以后,其他进程才有机会参与共享数据
- 方式一:同步代码块
public void hhh(){ synchronized("同步监视器") { //需要被同步的代码块 } } class ticket implements Runnable{ int ticket = 100; Object obj = new Object(); @Override public void run() { while (true) { synchronized(obj) { //这里obj也可以换成this if (ticket > 0) { try { sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + ticket--); } } } } }
public void hhh(){
synchronized("同步监视器") {
//需要被同步的代码块
}
}
同步监视器:任何类的对象都可以充当,哪个线程获取此监视器,谁就执行大括号里被同步的代码,俗称:锁。
要求:所有线程必须共用一把锁。否则无效。
注意:在实现Runable接口的方式中,考虑同步的话可以使用this来充当锁,但是在继承中,慎用this
- 方式二:同步方法
class ticket implements Runnable{ int ticket = 100; Object obj = new Object(); @Override public void run() { while (true) { // synchronized(obj) { //这里obj也可以换成this show(); // } } } public synchronized void show(){ if (ticket > 0) { try { sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + ":" + ticket--); } } }
将操作共享数据的方法声明为synchronized。即此方法为同步方法,能够保证当中一个线程执行此方法时,其他线程在外等待直至此线程执行完此方法。
--> 同步方法的 锁 :this。所以同步方法的多线程的实现一般用实现Runable接口的方式。
以上是关于线程2的主要内容,如果未能解决你的问题,请参考以下文章
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段