关于多线程学习遇到的一些问题
来源:互联网 发布:截面数据统计分析方法 编辑:程序博客网 时间:2024/06/05 09:29
一、使用同步锁时出现的问题
代码如下,
问题:出现了不能够同步的情况,不能够实现一个线程输出完30个数字之后再输出第二个线程,
线程交替输出。
原因:同步锁声明位置有误,不能在run方法中声明,要在线程还没有开始运行时定义好同步锁。
public class Test { public static void main(String[] args) { MyTh3 t=new MyTh3();// Lock lock=new ReentrantLock(); Thread th1=new Thread(t); th1.setName("线程1"); Thread th2=new Thread(t); th2.setName("线程2"); th1.start(); th2.start(); }}class MyTh3 implements Runnable{ Lock lock=new ReentrantLock();//在这里声明才是正确的 @Override public void run() { //声明一个lock对象// Lock lock=new ReentrantLock(); 此时的锁相当于各线程共享的数据,会导致后面不能正确锁住要执行的代码//要讲锁声明提到run方法前 try { lock.lock(); //加锁 cpu控制权在下面遇到解锁之前的代码运行结束之前都不会交给其他线程 for (int i = 0; i <30; i++) { System.out.println(Thread.currentThread().getName()+" 输出"+i); } } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock();//解锁 } }}
二、买票的经典问题
代码如下
问题:出现有的窗口卖出0号-1号票
原因:多个线程通过while验证时满足条件,进入while循环,在同步锁之前阻塞,但此时的票数为1,三个线程依次进入同步区域,执行卖票操作,导致票数1—>0—–>-1;
解决方案:进入同步区域后再次进行票数的验证。
public class Ticket implements Runnable{ public static void main(String[] args) { Ticket t=new Ticket(); Thread th1=new Thread(t); th1.setName("窗口1"); Thread th2=new Thread(t); th2.setName("窗口2"); Thread th3=new Thread(t); th3.setName("窗口3"); th1.start(); th2.start(); th3.start(); } int ticket=10; Lock lock=new ReentrantLock(); @Override public void run() { while(ticket>0){ lock.lock(); //加锁 锁共享资源 //再做一次判断,因为有可能线程绕过了while(ticket>0)这个判断后阻塞 if(ticket>0){ System.out.println(Thread.currentThread().getName()+"卖了第"+ticket+"号票"); ticket--; } lock.unlock();//解锁 try { //卖完一张票休眠100毫秒 Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
阅读全文
0 0
- 关于多线程学习遇到的一些问题
- 关于学习编程中会遇到的一些小问题
- 关于lua学习中遇到的一些个小问题
- 关于sam9x5移植遇到的一些问题
- 关于初学Hibernate遇到的一些问题
- 关于推送遇到的一些问题
- 关于编码遇到的一些问题
- 关于WDCP遇到的一些问题记录!
- 关于webservice遇到的一些问题
- 关于6.0权限遇到的一些问题
- 关于学习java多线程的一些感想
- struts2学习中遇到的一些问题
- 学习Hadoop中遇到的一些问题
- sift 学习中遇到的一些问题
- 总结学习遇到的一些问题
- 学习 操作系统 会遇到的一些问题
- Nativescript学习遇到的一些问题
- Android学习遇到的一些问题
- hdu 3535 AreYouBusy(多条件分类01背包)
- bzoj1758重建计划,树的点分治+单调队列(可能是常见套路?)
- 第七章 优雅地断开套接字连接
- MySql 事务与锁
- QR Code二维码原理
- 关于多线程学习遇到的一些问题
- 在handler中使用SmartUpload上传组件失败
- cmake——效率高跨平台的makefile生成神器
- PC Lint 用法说明,文件的作用
- Spring Cloud 服务链路追踪 (zipkin)
- Hibernate5 Dao层基类
- 关于如何在Myeclipse中创建SpringBoot项目
- hadoop以及相关组件介绍以及个人理解
- OpenMV时间操作