上次我们使用同步代码块解决线程安全问题,这次我们将采用第二种方式,同步方法,简单就是把同步代码块放在一个方法里。
格式:
修饰符 synchronized 返回值类型 方法名(参数列表){
线程安全问题的代码
}
使用步骤:
1.把访问了共享数据的代码抽出来。
2.在方法上添加synchronized修饰符。
**
*
* @author jianyeli
*/
public class Runnableimpl implements Runnable {
public int ticket= 100;
@Override
//设置线程任务
public void run() {
while(true){
payTicket();
}
//定义同步方法,把线程安全问题代码块放进里面
//同步方法的机制原理是将用同步方法把同步代码块锁住,然后只让一个线程执行,同步代码块我们使用的时候定义了一个对象作为监视器,这次我们的对象直接是new Runnable作为对象监视器。
public synchronized void payTicket(){
if(ticket>0){
System.out.println(Thread.currentThread().getName()+"正在卖---->"+ticket+"张票");
ticket--;
}
}
}
}
public class TestRunnableimpl1 {
public static void main(String[] args) {
Runnableimpl t = new Runnableimpl();
Thread m1 = new Thread(t);
Thread m2 = new Thread(t);
Thread m3 = new Thread(t);
//开启多个线程任务
m1.start();
m2.start();
m3.start();
}
}
以下是部分结果
出现执行线程时读取的数据相同
Thread-0正在卖---->100张票
Thread-1正在卖---->100张票
Thread-1正在卖---->97张票
Thread-1正在卖---->96张票
Thread-1正在卖---->95张票
Thread-1正在卖---->94张票
Thread-1正在卖---->93张票
Thread-1正在卖---->92张票
Thread-1正在卖---->91张票
Thread-1正在卖---->90张票
Thread-1正在卖---->89张票
Thread-1正在卖---->88张票