线程问题——同步和死锁
2014-09-02 13:45
218 查看
【问题引出】:比如说对于买票系统,有下面的代码:
【运行结果】
5
4
3
2
1
0
-1
这里出现了-1,显然这个是错的。,应该票数不能为负值。
如果想解决这种问题,就需要使用同步。所谓同步就是在统一时间段中只有有一个线程运行,
其他的线程必须等到这个线程结束之后才能继续执行。
【使用线程同步解决问题】
采用同步的话,可以使用同步代码块和同步方法两种来完成。
(一)同步代码块
语法格式:
synchronized(同步对象){
//需要同步的代码
}
但是一般都把当前对象this作为同步对象。
比如对于上面的买票的问题,如下(修改run方法):
【运行结果】:(每一秒输出一个结果)
5
4
3
2
1
(二)同步方法
语法格式为
synchronized 方法返回类型方法名(参数列表){
// 其他代码
}
修改run方法
运行结果同上。
提醒一下,当多个线程共享一个资源的时候需要进行同步,但是过多的同步可能导致死锁。
class hello implements Runnable { private static int count=5; public void run() { for(int i=0;i<10;++i){ if(count>0){ try{ Thread.sleep(1000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(count--); } } } public static void main(String[] args) { hello he=new hello(); Thread h1=new Thread(he); Thread h2=new Thread(he); Thread h3=new Thread(he); h1.start(); h2.start(); h3.start(); } }
【运行结果】
5
4
3
2
1
0
-1
这里出现了-1,显然这个是错的。,应该票数不能为负值。
如果想解决这种问题,就需要使用同步。所谓同步就是在统一时间段中只有有一个线程运行,
其他的线程必须等到这个线程结束之后才能继续执行。
【使用线程同步解决问题】
采用同步的话,可以使用同步代码块和同步方法两种来完成。
(一)同步代码块
语法格式:
synchronized(同步对象){
//需要同步的代码
}
但是一般都把当前对象this作为同步对象。
比如对于上面的买票的问题,如下(修改run方法):
public void run() { for(int i=0;i<10;++i){ synchronized(this){ if(count>0){ try{ Thread.sleep(1000); }catch(InterruptedException e){ e.printStackTrace(); } System.out.println(count--); } } } }
【运行结果】:(每一秒输出一个结果)
5
4
3
2
1
(二)同步方法
语法格式为
synchronized 方法返回类型方法名(参数列表){
// 其他代码
}
修改run方法
public void run() { for (int i = 0; i < 10; ++i) { sale(); } } public synchronized void sale() { if (count > 0) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(count--); } }
运行结果同上。
提醒一下,当多个线程共享一个资源的时候需要进行同步,但是过多的同步可能导致死锁。
相关文章推荐
- Linux环境下线程的同步与互斥以及死锁问题
- Java总结(十)—实现Runnable接口创建线程,线程安全同步,死锁(哲学家进餐问题),读写锁
- 任务,线程和同步(六)之线程问题:争用条件和死锁
- Java线程安全问题——同步和死锁
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- 进程、线程知识点总结和同步(消费者生产者,读者写者三类问题)、互斥、异步、并发、并行、死锁、活锁的总结
- java线程同步之死锁问题
- Android(java)学习笔记70:同步中的死锁问题以及线程通信问题
- Java笔记3 多线程<1>线程概述、多线程的创建、多线程的安全问题、静态同步函数的锁、死锁
- Linux下线程的同步与互斥以及死锁问题整理
- C#线程系列讲座(4):同步与死锁
- 线程同步学习_哲学家问题
- java线程同步问题(一个理解wait()与notify()的例子)
- java 同步死锁问题
- 线程的同步问题(java)
- java线程同步问题的总结
- 多个线程互同步问题
- Java线程同步问题之警察抓小偷
- 线程中死锁的问题
- java基础问题---java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用