解决线程安全问题_同步代码块和同步技术的原理
作者:互联网
同步代码块
同步代码块:javasynchronized
关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问;
格式:
synchronized(同步锁){
需要同步操作的代码
}
同步锁:
对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁
1.锁对象 可以是任意类型
2.多个线程对象要使用同一把锁
注意:在任何时候,最多允许一个线程拥有同步锁,谁拿到锁就进入代码块,其他线程只能在外等着
package com.yang.Test.ThreadStudy;
import lombok.SneakyThrows;
/**
* 卖票案例出现了线程安全的问题
* 卖出了不存在的票和重复的票
* 解决线程安全问题的一种方案:使用同步代码块
*/
public class RunnableImpl implements Runnable{
//定义一个多个线程共享的资源
private int ticket = 100;
//设置线程任务卖票
@SneakyThrows
@Override
public void run() {
//使用死循环重复卖票动作
while(true){
//同步代码块
synchronized (this){
//线判断票是否存在
if (ticket>0){
//票存在,卖票,ticket--
System.out.println(Thread.currentThread().getName()+"--->正在卖第"+ticket+"张票");
ticket--;
}else{
break;
}
}
}
}
}
package com.yang.Test.ThreadStudy;
public class DemoTicket {
public static void main(String[] args) {
RunnableImpl r1 = new RunnableImpl();
new Thread(r1).start();
new Thread(r1).start();
new Thread(r1).start();
}
}
运行结果:
同步技术的原理
标签:同步,Thread,代码,线程,ticket,public 来源: https://www.cnblogs.com/ailhy/p/16457324.html