线程安全
多线程应用程序同时访问共享对象时,由于线程间相互抢占CPU的控制权,造成一个线程夹在另一个线程的执行过程中运行,所以可能导致错误的执行结果。
问题:通过多线程解决小朋友分苹果的问题:一共有5个苹果,2个小朋友同时拿苹果,每次拿一个,拿完为止
线程安全的问题:
1. 理解并编写出线程不安全的实例代码
2. 使用 synchronized 代码块解决线程安全的问题:需要在 synchronized 代码块中参照共同的一个对象。
Synchronized 关键字:
为了防止共享对象在并发访问时出现错误,Java中提供了“synchronized”关键字。
synchronized关键字:确保共享对象在同一时刻只能被一个线程访问,这种处理机制称为“线程同步”或“线程互斥”。Java中的“线程同步”基于“对象锁”的概念
使用 synchronized 关键字:
1.修饰方法:
//定义同步方法
public synchronized void methd(){
//方法实现
}
– 当一个线程访问对象的同步方法时,被访问对象就处于“锁定”状态,访问该方法的其他线程只能等待,对象中的其他同步方法也不能访问,但非同步方法则可以访问
重新修改小朋友分苹果的例子,将getApple方法改为同步方法
使用 ”synchronized” 关键字:修饰部分代码,如果只希望同步部分代码行,可以使用“同步块,同步块的作用与同步方法一样,只是控制范围有所区别
//同步块
synchronized(obj){
//被同步的代码块
}