摘要:
需求:三个窗口,卖50张票,卖完截至 代码如下: 疑问:为什么我们的共享资源为什么不需要加static修饰?(其实这个是我没注意的) 原来我们如果用第二个方式的话,可以看出上面代码中,我们只需要实例化一个runnable的实现类的, 其实我们加了static修饰其实也没有影响,只是加了,它的生命周期 阅读全文
摘要:
线程实现方式二: 1.自定义一个类实现runnable接口 class Thread implements Runnable 查看源代码,我们可以知道Thread实现了runnable接口 runnable中只有一个run抽象类 2.实现run方法,把自定义线程的任务定义在run方法里面 3.创建一 阅读全文
摘要:
死锁: 出现死锁的原因:线程A等待线程B释放锁资源,同时线程B等待线程A释放资源 可能出现死锁的情况: 1.存在2个或者2个以上的线程 2.存在2个或者2个以上的共享资源 需求: 有2个人要看电视,狗蛋有遥控器,张三有电池。只有电池和遥控器都有了才能看电视 代码如下: 可以发现张三拿到了电池却怎么也 阅读全文
摘要:
方式二:同步函数 通俗讲:就是用synchronized修饰的函数 同步函数注意事项: 1.如果一个同步函数是非静态的,那么它的所对象就是this对象(函数调用者对象), 如果一个同步函数的锁对象是静态的,那么锁对象就是当前函数所属字节码对象(class文件) 2.同步函数的锁是固定的,不能由我们来 阅读全文
摘要:
解决线程问题: 方式一:同步代码块(synchronized) 语法: synchronized ("锁对象") { //需要锁定的代码 } 解决线程安全问题原理: 当我们使用同步代码块时,就当与给此段语句上了一个锁,当一个线程A进去的时候,锁的状态会从开变成关,后面的线程是进不来的。 当进去的线程 阅读全文
摘要:
需求:三个窗口同时售卖50张票 代码如下: 疑问:怎么每个窗口都卖了50号的票,本来只有50张票,怎么卖出了150张的票呢? 原因:因为票数是静态的成员变量,静态的成员变量会在每个对象中都会维护一份数据 解决方案:把票数变成静态的成员变量,共享给三个对象 代码如下: 疑问:怎么又把50号票卖了三次呢 阅读全文