当前位置: 首页 > news >正文

链接网站开发需要多少钱十堰微网站建设费用

链接网站开发需要多少钱,十堰微网站建设费用,在山东省建设监理协会网站,自助建站信息网问题要求: 有三个线程 A、B、C,分别调用 first()、second()、third(),但必须保证: first() 先执行,然后 second(),最后 third()。但由于线程是并发执行的,操作系统可能会随机调度它们的顺序&a…

问题要求:

有三个线程 A、B、C,分别调用 first()second()third(),但必须保证:

  1. first() 先执行,
  2. 然后 second()
  3. 最后 third()
  4. 但由于线程是并发执行的,操作系统可能会随机调度它们的顺序,所以需要强制让它们按顺序执行

方法 1:

volatile 变量(最简单)

思路:
  • 设置一个变量 flag,用来标记当前应该执行哪个方法。
  • first() 执行完后,修改 flag,告诉 second() 可以运行了。
  • second() 执行完后,修改 flag,告诉 third() 可以运行了。
代码:
public class Foo {    
private volatile int flag = 1;// 1表示first可以执行,2表示second,3表示third    public void first() {        System.out.print("first");        flag = 2; // 告诉second可以执行了    }    public void second() throws InterruptedException{        while (flag != 2) {            // 如果flag不是2,就循环等待       }        System.out.print("second");        flag = 3; // 告诉third可以执行了   }    public void third() throws InterruptedException {        while (flag != 3) {           // 如果flag不是3,就循环等待       }       System.out.print("third");    }}
解释:
  • volatile 保证 flag 的修改对所有线程可见(避免缓存问题)。
  • second()third() 会不断检查 flag,直到 flag 变成它们需要的值才执行。
缺点:
  • while 循环会占用 CPU(忙等待),不太高效。

方法 2:

synchronized + wait/notify(更高效)

思路:
  • synchronized 加锁,保证同一时间只有一个线程能进入关键代码。
  • wait() 让线程等待,notifyAll() 唤醒其他线程。
代码:
public class Foo {    
private boolean firstDone = false;    
private boolean secondDone = false;    
private final Object lock = new Object(); // 锁对象    public void first() {        
synchronized (lock) {            
System.out.print("first");           firstDone = true;            lock.notifyAll(); // 唤醒所有等待的线程        }    }    public void second() throws InterruptedException {        
synchronized (lock) {            while (!firstDone) {                lock.wait(); // 如果first没执行完,就等待            }            System.out.print("second");            secondDone = true;            lock.notifyAll(); // 唤醒third        }    }    public void third() throws InterruptedException {        synchronized (lock) {            while (!secondDone) {                lock.wait(); // 如果second没执行完,就等待            }           System.out.print("third");        }    }}
解释:
  • synchronized 保证同一时间只有一个线程能进入 lock 保护的代码块。
  • wait() 会让线程释放锁并等待,直到被 notifyAll() 唤醒。
  • first() 执行完后,notifyAll() 会唤醒 second()second() 执行完后唤醒 third()
优点:
  • volatile 更高效,因为 wait() 不会占用 CPU。

方法 3:

CountDownLatch(推荐)

思路:
  • CountDownLatch 是一个计数器,初始值为 1。
  • await() 会阻塞线程,直到计数器变成 0。- countDown() 会让计数器减 1。
代码:
import java.util.concurrent.CountDownLatch;
public class Foo {    
private CountDownLatch latch1 = new CountDownLatch(1); 
// first -> second    
private CountDownLatch latch2 = new CountDownLatch(1); 
// second -> third    
public void first() {        
System.out.print("first");        
latch1.countDown(); // 让second可以执行    
}    
public void second() throws InterruptedException {        
latch1.await(); // 等待first执行完        
System.out.print("second");        
latch2.countDown(); // 让third可以执行    
}    
public void third() throws InterruptedException {        
latch2.await(); // 等待second执行完        
System.out.print("third");    }
}
解释:
  • latch1 控制 first() -> second()
  • first() 执行完后,latch1.countDown()latch1 变成 0,second()await() 就会放行。
  • latch2 控制 second() -> third()
  • second() 执行完后,latch2.countDown()latch2 变成 0,third()await() 就会放行。
优点:
  • 代码简洁,适合这种固定顺序的线程控制。

方法 4:

Semaphore(信号量)

思路:
  • Semaphore 可以控制同时访问的线程数量。
  • 初始值为 0 的信号量,acquire() 会阻塞,直到 release() 被调用。
代码:
import java.util.concurrent.Semaphore;
public class Foo {    
private Semaphore sem1 = new Semaphore(0); 
// first -> second    
private Semaphore sem2 = new Semaphore(0); 
// second -> third    
public void first() {        
System.out.print("first");        
sem1.release(); // 让second可以执行    
}    
public void second() throws InterruptedException {        
sem1.acquire(); // 等待first执行完        
System.out.print("second");        
sem2.release(); // 让third可以执行    
}    
public void third() throws InterruptedException {        
sem2.acquire(); 
// 等待second执行完        
System.out.print("third");    }}
解释:
  • sem1 控制 first() -> second()
  • first() 执行完后 sem1.release()second()sem1.acquire() 就会放行。
  • sem2 控制 second() -> third(): - second() 执行完后 sem2.release()third()sem2.acquire() 就会放行。
优点:
  • 灵活,适合更复杂的线程控制。

推荐

  • 如果是面试或简单场景,用 CountDownLatchvolatile
  • 如果需要更灵活的控制,用 Semaphoresynchronized
http://www.dtcms.com/a/548442.html

相关文章:

  • 网站怎么申请百度小程序58同城鞍山招聘信息
  • 平面设计网站有哪些比较好的天津市建筑信息平台
  • 企业网站优化分为两个方向修水新闻最新消息
  • 58同城做网站找谁微信关注公众号
  • 上海网站建设联系电话五合一小程序网站
  • 手机网站 分享vs做网站开发吗
  • 企业网站 php如何申请com网站
  • 广西网站建设网址软件工程专业考研学校排名
  • wordpress 新网站 代码深圳关键词排名首页
  • 昆明网站建设锐网竞价恶意点击立案标准
  • 网站后台管理系统多少钱移动wordpress加速
  • 好网站建设公司的网站如何建设自己网站首页
  • 桓台网站六安市程序
  • 漳州 网站建设多少钱找货源上什么平台最好
  • 金泉网 网站建设营销软件商城
  • 网站站长工具家具类网站如何优化
  • 企业网站怎么搜索优化重庆网络公司一览表
  • 知识产权教育网站建设方案wordpress与discuz
  • 手机看电视剧网站大全古建设计素材网站
  • 做兼职网站如果启动浏览器就能直接打开一个常用的网站主页_要怎么做?
  • 建站系统的应用场景餐饮网站源码
  • 上海市建设合同信息表网站百度关键词优化的方法
  • 深圳网站建设排行上海人才中心档案托管
  • 网站开发内容和方法西安官网seo
  • 网站建设最新新闻有名的淘宝客网站
  • 情感视频素材网站好听的公司名字大全
  • 网站建设与管理的体会社交平台推广方式
  • 网站改版不换域名怎么做申请个人网站
  • 肇庆网站建设优化企业信用报告网上查询
  • 黄龙云 加强网站建设更换网站标题