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

长沙公司做网站大概多少钱学做网站看什么书

长沙公司做网站大概多少钱,学做网站看什么书,舟山网站设计公司,如何在微信内做网站JAVA多线程(5) 线程安全问题概述 卖票问题分析 单窗口卖票 一个窗口(单线程)卖100张票没有问题 单线程程序是不会出现线程安全问题的 多个窗口卖不同的票 3个窗口一起卖票,卖的票不同,也不会出现问题 多线程程序,没有访问共享数据,不会产生问题 多个窗口卖相同的票 3个窗口…JAVA多线程(5) 线程安全问题概述 卖票问题分析 单窗口卖票 一个窗口(单线程)卖100张票没有问题 单线程程序是不会出现线程安全问题的 多个窗口卖不同的票 3个窗口一起卖票,卖的票不同,也不会出现问题 多线程程序,没有访问共享数据,不会产生问题 多个窗口卖相同的票 3个窗口卖的票是一样的,就会出现安全问题 多线程访问了共享的数据,会产生线程安全问题 线程安全问题代码实现 模拟卖票案例 创建3个线程,同时开启,对共享的票进行出售 public class Demo01Ticket {public static void main(String[] args) {//创建Runnable接口的实现类对象RunnableImpl run new RunnableImpl();//创建Thread类对象,构造方法中传递Runnable接口的实现类对象Thread t0 new Thread(run);Thread t1 new Thread(run);Thread t2 new Thread(run);//调用start方法开启多线程t0.start();t1.start();t2.start();} } public class RunnableImpl implements Runnable{//定义一个多个线程共享的票源private int ticket 100;//设置线程任务:卖票Overridepublic void run() {//使用死循环,让卖票操作重复执行while(true){//先判断票是否存在if(ticket0){//提高安全问题出现的概率,让程序睡眠try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}//票存在,卖票 ticket--System.out.println(Thread.currentThread().getName()--正在卖第ticket张票);ticket--;}}} }线程安全问题原理分析 线程安全问题产生原理图 分析线程安全问题正常是不允许产生的,我们可以让一个线程在访问共享数据的时候,无论是否失去了cpu的执行权;让其他的线程只能等待,等待当前线程卖完票,其他线程在进行卖票。 解决线程安全问题办法1-synchronized同步代码块 同步代码块synchronized 关键字可以用于方法中的某个区块中表示只对这个区块的资源实行互斥访问。 使用synchronized同步代码块格式: synchronized(锁对象){ 可能会出现线程安全问题的代码(访问了共享数据的代码) } 代码实现如下 public class Demo01Ticket {public static void main(String[] args) {//创建Runnable接口的实现类对象RunnableImpl run new RunnableImpl();//创建Thread类对象,构造方法中传递Runnable接口的实现类对象Thread t0 new Thread(run);Thread t1 new Thread(run);Thread t2 new Thread(run);//调用start方法开启多线程t0.start();t1.start();t2.start();} } public class RunnableImpl implements Runnable{//定义一个多个线程共享的票源private int ticket 100;//创建一个锁对象Object obj new Object();//设置线程任务:卖票Overridepublic void run() {//使用死循环,让卖票操作重复执行while(true){//同步代码块synchronized (obj){//先判断票是否存在if(ticket0){//提高安全问题出现的概率,让程序睡眠try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}//票存在,卖票 ticket--System.out.println(Thread.currentThread().getName()--正在卖第ticket张票);ticket--;}}}} }⚠️注意: 代码块中的锁对象,可以使用任意的对象。但是必须保证多个线程使用的锁对象是同一个。锁对象作用把同步代码块锁住,只让一个线程在同步代码块中执行。 同步技术原理分析 同步技术原理 使用了一个锁对象,这个锁对象叫同步锁,也叫对象锁,也叫对象监视器 3个线程一起抢夺cpu的执行权,谁抢到了谁执行run方法进行卖票。 t0抢到了cpu的执行权,执行run方法,遇到synchronized代码块这时t0会检查synchronized代码块是否有锁对象 发现有,就会获取到锁对象,进入到同步中执行 t1抢到了cpu的执行权,执行run方法,遇到synchronized代码块这时t1会检查synchronized代码块是否有锁对象 发现没有,t1就会进入到阻塞状态会一直等待t0线程归还锁对象t0线程执行完同步中的代码,会把锁对象归 还给同步代码块t1才能获取到锁对象进入到同步中执行 总结:同步中的线程,没有执行完毕不会释放锁,同步外的线程没有锁进不去同步。 解决线程安全问题办法2-synchronized普通同步方法 同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。 格式 public synchronized void payTicket(){ 可能会出现线程安全问题的代码(访问了共享数据的代码) } 代码实现 public /**synchronized*/ void payTicket(){synchronized (this){//先判断票是否存在if(ticket0){//提高安全问题出现的概率,让程序睡眠try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}//票存在,卖票 ticket--System.out.println(Thread.currentThread().getName()--正在卖第ticket张票);ticket--;}}}分析 定义一个同步方法同步方法也会把方法内部的代码锁住只让一个线程执行。 同步方法的锁对象是谁? 就是实现类对象 new RunnableImpl()也是就是this所以同步方法是锁定的this对象。 解决线程安全问题办法3-synchronized静态同步方法 同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外等着。对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。 格式 public static synchronized void payTicket(){ 可能会出现线程安全问题的代码(访问了共享数据的代码) } 代码实现 public static /**synchronized*/ void payTicketStatic(){synchronized (RunnableImpl.class){//先判断票是否存在if(ticket0){//提高安全问题出现的概率,让程序睡眠try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}//票存在,卖票 ticket--System.out.println(Thread.currentThread().getName()--正在卖第ticket张票);ticket--;}}}分析 静态的同步方法锁对象是谁? 不能是this,this是创建对象之后产生的,静态方法优先于对象 静态方法的锁对象是本类的class属性–class文件对象(反射)。 解决线程安全问题办法4-Lock锁 Lock接口中的方法: public void lock() :加同步锁。public void unlock() :释放同步锁 使用步骤: 在成员位置创建一个ReentrantLock对象在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁 代码实现 public class RunnableImpl implements Runnable{//定义一个多个线程共享的票源private int ticket 100;//1.在成员位置创建一个ReentrantLock对象Lock l new ReentrantLock();//设置线程任务:卖票Overridepublic void run() {//使用死循环,让卖票操作重复执行while(true){//2.在可能会出现安全问题的代码前调用Lock接口中的方法lock获取锁l.lock();try {//先判断票是否存在if(ticket0) {//提高安全问题出现的概率,让程序睡眠Thread.sleep(10);//票存在,卖票 ticket--System.out.println(Thread.currentThread().getName() --正在卖第 ticket 张票);ticket--;}} catch (InterruptedException e) {e.printStackTrace();}finally {l.unlock();//3.在可能会出现安全问题的代码后调用Lock接口中的方法unlock释放锁//无论程序是否异常,都会把锁释放}}}分析 java.util.concurrent.locks.Lock接口 Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。相比SynchronizedReentrantLock类提供了一些高级功能主要有以下3项 1.等待可中断持有锁的线程长期不释放的时候正在等待的线程可以选择放弃等待这相当于Synchronized来说可以避免出现死锁的情况。通过lock.lockInterruptibly()来实现这个机制。 2.公平锁多个线程等待同一个锁时必须按照申请锁的时间顺序获得锁Synchronized锁非公平锁ReentrantLock默认的构造函数是创建的非公平锁可以通过参数true设为公平锁但公平锁表现的性能不是很好。 公平锁、非公平锁的创建方式 //创建一个非公平锁默认是非公平锁 Lock lock new ReentrantLock(); Lock lock new ReentrantLock(false);//创建一个公平锁构造传参true Lock lock new ReentrantLock(true);3.锁绑定多个条件一个ReentrantLock对象可以同时绑定多个对象。ReenTrantLock提供了一个Condition条件类用来实现分组唤醒需要唤醒的线程们而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。 ReentrantLock和Synchronized的区别 相同点 它们都是加锁方式同步都是重入锁阻塞式的同步也就是说当如果一个线程获得了对象锁进入了同步块其他访问该同步块的线程都必须阻塞在同步块外面等待而进行线程阻塞和唤醒的代价是比较高的操作系统需要在用户态与内核态之间来回切换代价很高不过可以通过对锁优化进行改善 不同点 ck对象可以同时绑定多个对象。ReenTrantLock提供了一个Condition条件类用来实现分组唤醒需要唤醒的线程们而不是像synchronized要么随机唤醒一个线程要么唤醒全部线程。 ReentrantLock和Synchronized的区别 相同点 它们都是加锁方式同步都是重入锁阻塞式的同步也就是说当如果一个线程获得了对象锁进入了同步块其他访问该同步块的线程都必须阻塞在同步块外面等待而进行线程阻塞和唤醒的代价是比较高的操作系统需要在用户态与内核态之间来回切换代价很高不过可以通过对锁优化进行改善 不同点
http://www.zqtcl.cn/news/977169/

相关文章:

  • 公司网站主机流量30g每月够用吗攀枝花网站网站建设
  • 淘宝做图片的网站手机网站北京
  • 重庆网站首页排名公司网站公众号小程序开发公司
  • 河源网站制作1993seo福州室内设计公司排名
  • 哪里有做装修网站网站开发总出现出现404
  • 做a漫画在线观看网站策划营销型网站
  • 怎么 从头开始建设一个网站临沂高端网站建设
  • 网页设计制作网站素材传奇代理平台
  • 公司建站网站软文营销方案
  • 成品短视频网站源码搭建免费温州外贸网站制作
  • 旅游公司网站建设pptwordpress 用户增强
  • wordpress 最新东莞seo技术培训
  • 上海微网站开发网站 选项卡 图标
  • 淘宝网站建设的目标什么做网站公司 营销
  • 360企业网站认证wordpress 个人照片
  • 韩国私人网站服务器创业做网站APP开发
  • 成都网站建设推来客网站系统报价wordpress 本地图片 图床
  • 跨境电商怎么做流程青岛网站建设seo
  • 怎么搭建网站平台网站建设相关文献
  • 网站前面的小图标怎么做wordpress文章页广告插件
  • 设计制作一个 个人主页网站淄博做网站的公司都有哪些
  • 10月哪个网站做电影票活动宁波设计公司有哪些
  • 网站建设的pest分析公司erp系统
  • 网站开发一般用哪个浏览器高端酒店网站模板
  • 响应式网站开发哪个好徐州关键字优化咨询
  • 企业建站都有什么网站宁波那家公司做网站好
  • 哪里有零基础网站建设教学培训网页制作要多少钱
  • 云南建站网站建设的编程技术
  • 知名的饰品行业网站开发wordpress镜像存储插件
  • 网站整体地图怎么做小榄公司网站建设