package com.iflysse.test05;
/**
* 线程的声明周期:
新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态
就绪:新建线程被start()后,将进入线程队列等待cpu时间片
运行:当就绪线程被调度并获得处理器资源时,进入运行状态;
阻塞:某种特殊情况下,被人为挂起,让出cpu并临时中止自己的执行,进入阻塞状态
死亡:线程完成了它的全部工作,或被提前强制性的中止
-
- ①线程安全问题存在的原因
由于一个线程在操作共享数据过程中,未执行结束,另外的线程参与进来,导致共享数据存在安全问题
②如何解决线程的安全问题
必须让一个线程操作共享数据完毕以后,其它线程才有机会参与共享数据的操作③java如何实现线程安全,线程的同步机制
1)同步代码块
synchronized (同步监视器) {
//需要被同步的代码(即操作共享数据的代码)
} - ①线程安全问题存在的原因
共享数据:多个线程共同操作的同一个数据(变量)
同步监视器:由任何一个类的对象来充当。那个线程获取此监视器,谁就执行共享数据锁必须是唯一的
所有的线程必须公用一把锁!
注:在实现的方式中,考虑同步的话,可以使用this来当锁,但在继承的方式中,慎用!-
- 2)同步方法
将操作共享数据的方法声明为synchronizd,即此方法为同步方法。
能够保证当其中一个线程执行此方法时,其他线程在外等待直至此线程执行完此方法。
同步方法的锁:当前对象(this)
* - 2)同步方法
-
- 小结:释放锁的操作
*
- 小结:释放锁的操作
- ①当前线程的同步方法、同步代码块执行结束
- ②当前线程在同步方法、同步代码块中遇到break/return终止了改代码块
- ③当前线程在同步方法、同步代码块中出现了未处理的Error/Exception
- ④当前线程在同步方法、同步代码块中执行了线程对象的wait()方法,当前线程暂停,并释放锁
-
- sleep();不释放锁
-
- 死锁的问题
不同的线程分别占用对方所需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
- 死锁的问题
如何解决
减少同步资源的定义*/
public class Day032805 { public static void main(String[] args) { final StringBuffer sb1 = new StringBuffer(""); final StringBuffer sb2 = new StringBuffer(""); //定义两个线程 1 2 //A先获取锁sb1 插入数据 再获取所sb2 打印数据 //B先获取所sb2 再获取所sb1 //定义线程1 //匿名类匿名对象 1 new Thread(){ public void run(){ synchronized (sb1) { sb1.append("A"); try { Thread.currentThread().sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized (sb2) { sb2.append("B"); System.out.println("=================="); System.out.println(sb1); System.out.println(sb2); System.out.println("=================="); } } } }.start(); //线程2 new Thread(){ public void run(){ synchronized (sb2) { sb1.append("C"); try { Thread.currentThread().sleep(10); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synchronized (sb1) { sb2.append("D"); System.out.println("**********************"); System.out.println(sb1); System.out.println(sb2); System.out.println("**********************"); } } } }.start(); } }