黑马程序员技术交流社区
标题:
【记录】代码练习-多线程同步问题
[打印本页]
作者:
Kevin.Kang
时间:
2015-8-5 10:36
标题:
【记录】代码练习-多线程同步问题
为了模拟真实环境,代码加入延时
package com.kxg_09;
public class SellTicekt implements Runnable {
private int ticket = 100;
@Override
public void run() {
while (true) {
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第"
+ (ticket--) + "张票");
}
}
}
}
复制代码
package com.kxg_09;
/*
* 实现Runnable接口
*/
public class SellTicketDemo {
public static void main(String[] args) {
// 创建自定义类对象
SellTicekt st = new SellTicekt();
// 创建线程
Thread t1 = new Thread(st);
Thread t2 = new Thread(st);
// 设置线程名称
t1.setName("窗口1");
t2.setName("窗口2");
// 启动线程
t1.start();
t2.start();
}
}
复制代码
此时运行程序就会出现相同票卖多次和出现负数票的情况
作者:
Kevin.Kang
时间:
2015-8-5 10:47
1.相同的票卖了多次
CPU的一次操作必须是原子性的
2.出现负数票
线程的随机性和延迟导致的
解决方式1:同步代码块
把多条语句操作共享数据的代码给包成一个整体,让某个线程在执行的时候,别人不能来执行
package com.kxg_09;
/*
* synchronized(对象){
* 代码;
* }
*
* 注意:同步代码块可以解决安全问题的根本原因在对象上,该对象如果锁一样的功能,别的线程不能进入。
* 这个对象可以是任意对象,最好是用本身this作为这个对象。
*
*/
public class SellTicekt implements Runnable {
private int ticket = 100;
@Override
public void run() {
while (true) {
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ "正在出售第" + (ticket--) + "张票");
}
}
}
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-8-5 11:08
方式2:同步方法
package com.kxg_09;
/*
* synchronized关键字修饰方法
* 锁对象是this
*/
public class SellTicekt implements Runnable {
private int ticket = 100;
@Override
public synchronized void run() {
while (true) {
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "正在出售第"
+ (ticket--) + "张票");
}
}
}
}
复制代码
作者:
Kevin.Kang
时间:
2015-8-5 11:14
本帖最后由 Kevin.Kang 于 2015-8-26 15:01 编辑
同步特点:
前提:多个线程
解决问题注意:多个线程使用的是同一个锁对象
同步好处:
同步解决了多线程的安全问题
同步的弊端:
当线程很多时,因为每个线程都会去判断同步上的锁,很消耗资源,降低程序的运行效率
作者:
15225159271
时间:
2015-8-5 11:28
好用功啊,比老师的视频代码你都给练习了
作者:
宋亚楠
时间:
2015-8-5 11:52
向你致敬,实在是太用功了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2