线程并发产生的安全问题
* @PackageName:Threadtest
* @ClassName:SafeThread
* @Description:模拟多人抢票产生的线程安全问题
* 问题描述:多个线程同时操作一个对象,举例火车票
* 结果:数据紊乱,线程不安全,第一张票被同时抢了
* @date 2021/8/10 19:20
*/
public class SafeThread implements Runnable{
private int tickets=10;
@Override
public void run() {
while (true) {
if (tickets <= 0)
break;
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"手速极快的抢到了第"
+tickets--+"票");
}
}
public static void main(String[] args) {
SafeThread safeThread = new SafeThread();
new Thread(safeThread,"广东人").start();
new Thread(safeThread,"上海人").start();
new Thread(safeThread,"北京人").start();
}
}
多人同时抢票,因为没有加锁,所以出现同一张票被多人抢或者抢一张不存在的票
运行结果(文字版)
北京人手速极快的抢到了第9票
广东人手速极快的抢到了第8票
上海人手速极快的抢到了第10票
广东人手速极快的抢到了第7票
北京人手速极快的抢到了第6票
上海人手速极快的抢到了第5票
上海人手速极快的抢到了第4票
广东人手速极快的抢到了第3票
北京人手速极快的抢到了第2票
广东人手速极快的抢到了第1票
上海人手速极快的抢到了第1票
北京人手速极快的抢到了第0票
`Process finished with exit code 0
龟兔赛跑小程序(多线程的熟悉练习)
* @PackageName:Threadtest
* @ClassName:ThreadGame
* @Description:龟兔赛跑小游戏,兔子每20步睡一次觉,睡2ms
* @date 2021/8/10 19:42
*/
public class ThreadGame implements Runnable{
private static String winner;
@Override
public void run() {
for (int i = 1; i <= 1000; i++) {
if (Thread.currentThread().getName().equals("兔子")&&i%20==0){
try {
Thread.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
boolean flag =haswinner(i);
if (flag) {
break;
}
System.out.println(Thread.currentThread().getName()+"走了"+i+"步");
}
}
public Boolean haswinner(int i){
if (winner!=null){
return true;
}
if (i>=1000 ){
winner=Thread.currentThread().getName();
System.out.println("比赛结束,胜利者是:"+winner);
return true;
}
return false;
}
public static void main(String[] args) {
ThreadGame threadGame = new ThreadGame();
new Thread(threadGame,"兔子").start();
new Thread(threadGame,"乌龟").start();
}
}
乌龟走了998步
乌龟走了999步
兔子走了121步
比赛结束,胜利者是:乌龟
静态代理模式
总结:
真实对象和代理对象都要实现同一个接口
代理对象要代理真实角色
好处:
代理对象可以做很多真实对象做不了的事情
真实对象专注做自己的事情
Lamda表达式
好处:
避免匿名内部类定义过多
代码简洁
代码减负,留下核心代码
函数式接口
任何接口,如果只包含唯一一个抽象方法,那么它就是函数式接口
对于函数式接口,我们可以通过Lamda表达式来创建该接口的对象