没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
一、同步方法
(1)同步方法--案例1
1、案例1
2、案例1之同步监视器
(2)同步方法--案例2
1、案例2之同步监视器的问题
2、案例2的补充说明
二、代码及重要说明
(1)代码
(2)重要说明
一、同步方法
同步方法: synchronized 关键字直接修饰方法,表示同一时刻只有一个线程能进入这个方法,其
他线程在外面等着。
🗳
格式:
(1)同步方法--案例1
1、案例1
还是拿这个例子来说,方式一 实现Runnable接口 ,如下:
🌱
代码
public synchronized void method(){
可能会产生线程安全问题的代码
}
package yuyi02;
/**
* ClassName: WindowTset2
* Package: yuyi02
* Description:
* 使用同步方法解决实现Runnable接口的线程安全问题
* @Author 雨翼轻尘
* @Create 2024/1/30 0030 9:52
*/
public class WindowTest2 {
public static void main(String[] args) {
//3.创建当前实现类的对象
SaleTicket2 s=new SaleTicket2();
//4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的实例
🍺
输出结果(部分)
Thread t1 = new Thread(s);
Thread t2 = new Thread(s);
Thread t3 = new Thread(s);
//给三个线程起名字
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
//5.通过Thread类的实例调用start():1.启动线程 2.调用当前线程的run()。
t1.start();
t2.start();
t3.start();
}
}
class SaleTicket2 implements Runnable{ //卖票 1.创建一个实现Runnable接口的类(实
现类)
int ticket=100;
@Override
public void run() { //2.实现接口中的抽象方法run()方法
while (true){
if(ticket>0){ //如果票数大于0就可以售票
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//哪个窗口卖票了,票卖了多少
System.out.println(Thread.currentThread().getName() + "售票,票号
为:" + ticket); //最开始票号为100
ticket--;
}else{
break;
}
}
}
}
可以看到,出现了重票和错票。
现在来解决这个安全问题。
操作 ticket 的代码:
现在将他们完全声明在一个方法 show() 当中,然后在while里面调用 show() 方法。比如:
我们可以将 while 里面的 show() 用 synchronized 包裹,就是同步代码块的方式,如下:
当然也可以将 show 方法声明为同步方法。
现在这里有点错误,就是 break 的问题。之前是在while里面写的,现在将 if-else 从while里面抽
出来了,所以break就不行了。
将break直接删掉吗?不行,这样的话程序就不能自己结束了。如下:
public void run() { //2.实现接口中的抽象方法run()方法
while (true){
synchronized (this) {
show();
}
}
}
我们可以声明一个变量 isFlag ,初始化为true。如下:
🌱
代码
public class WindowTest2 {
public static void main(String[] args) {
剩余24页未读,继续阅读
资源评论
雨翼轻尘
- 粉丝: 6w+
- 资源: 130
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功