java_第13章 多线程(2)
来源:互联网 发布:天猫魔盒直播软件 编辑:程序博客网 时间:2024/04/30 08:12
13.4 线程的同步
线程间共享代码和数据可以节省系统开销,提高程序运行效率,但同时也导致了数据的“访问冲突”问题,如何实现线程间的有机交互、并确保共享资源在某些关键时段只能被一个线程访问,即所谓的“线程同步”(Synchronization)就变得至关重要
多个线程间共享的数据称为临界资源(Critical Resource),由于是线程调度器负责线程的调度,程序员无法精确控制多线程的交替顺序。因此,多线程对临界资源的访问有时会导致数据的不一致行
为了避免线程的随即执行和它不受控制,也就是为了避免这个临界资源问题,最基本,最简单的就是引用同步关键字synchronized,它的作用就是:对于同一个对象(不是一个类的不同对象),当多个线程同时执行该代码块或方法时,必须依次执行。
同步的两种表现形式:
1.同步代码块
synchronized(对象){
需要同步的代码
}
2.同步函数: 使用的锁是this
public synchronized void show(){
}
同步的作用:避免线程的安全隐患
例:
package com.hbsi;
public class SaleTicket implements Runnable{
/**
* @param args
*/
private int ticket=100;
//Object obj=new Object();
public static void main(String[] args) {
SaleTicket st=new SaleTicket();
Thread t1=new Thread(st);
Thread t2=new Thread(st);
t1.start();
t2.start();
}
public synchronized void run(){
while(true){
//synchronized(obj){
if(ticket>0){
/*try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
System.out.println(Thread.currentThread().getName()+"..."+ticket--);
}
}
}
}
其执行结果为:
Thread-1...100
Thread-1...99
Thread-1...98
Thread-1...97
Thread-1...96
Thread-1...95
Thread-1...94
Thread-1...93
Thread-1...92
Thread-1...91
Thread-1...90
Thread-1...89
Thread-1...88
Thread-1...87
Thread-1...86
Thread-1...85
Thread-1...84
Thread-1...83
Thread-1...82
Thread-1...81
Thread-1...80
Thread-1...79
Thread-1...78
Thread-1...77
Thread-1...76
Thread-1...75
Thread-1...74
Thread-1...73
Thread-1...72
Thread-1...71
Thread-1...70
Thread-1...69
Thread-1...68
Thread-1...67
Thread-1...66
Thread-1...65
Thread-1...64
Thread-1...63
Thread-1...62
Thread-1...61
Thread-1...60
Thread-1...59
Thread-1...58
Thread-1...57
Thread-1...56
Thread-1...55
Thread-1...54
Thread-1...53
Thread-1...52
Thread-1...51
Thread-1...50
Thread-1...49
Thread-1...48
Thread-1...47
Thread-1...46
Thread-1...45
Thread-1...44
Thread-1...43
Thread-1...42
Thread-1...41
Thread-1...40
Thread-1...39
Thread-1...38
Thread-1...37
Thread-1...36
Thread-1...35
Thread-1...34
Thread-1...33
Thread-1...32
Thread-1...31
Thread-1...30
Thread-1...29
Thread-1...28
Thread-1...27
Thread-1...26
Thread-1...25
Thread-1...24
Thread-1...23
Thread-1...22
Thread-1...21
Thread-1...20
Thread-1...19
Thread-1...18
Thread-1...17
Thread-1...16
Thread-1...15
Thread-1...14
Thread-1...13
Thread-1...12
Thread-1...11
Thread-1...10
Thread-1...9
Thread-1...8
Thread-1...7
Thread-1...6
Thread-1...5
Thread-1...4
Thread-1...3
Thread-1...2
Thread-1...1
死锁
两个线程A、B用到同一个对象s(s为共享资源),且线程A在执行中要用到B运行后所创造的条件。在这种前提下A先开始运行,进入同步块后,对象s被锁定,接着线程A因等待B运行结束而进入阻塞状态,于是B开始运行,但因无法访问对象s,线程B也进入阻塞状态,等待s被线程A解锁。最终的结果:两个线程互相等待,都无法运行。
例:
public class DeadLock {
/**
* @param args
*/
public static void main(String[] args) {
Demo6 d1=new Demo6(true);
Demo6 d2=new Demo6(false);
Thread t1=new Thread(d1);
Thread t2=new Thread(d2);
t1.start();
t2.start();
}
}
class MyLock{
static MyLock lock1=new MyLock();
static MyLock lock2=new MyLock();
}
class Demo6 implements Runnable{
//String str1=new String("aaa");
//String str2=new String("bbb");
private boolean flag;
public Demo6(boolean flag){
this.flag=flag;
}
@Override
public void run() {
if(flag){
synchronized(MyLock.lock1){
System.out.println(Thread.currentThread().getName()+"...if...str1");
synchronized(MyLock.lock2){
System.out.println(Thread.currentThread().getName()+"...if...str2");
}
}
}else{
synchronized(MyLock.lock2){
System.out.println(Thread.currentThread().getName()+"...else...str2");
synchronized(MyLock.lock1){
System.out.println(Thread.currentThread().getName()+"...else...str1");
}
}
}
}
}
- java_第13章 多线程(2)
- java_第13章 多线程(1)
- 第十一章:Java_多线程
- Java_多线程(上)
- Java_多线程(下)
- Java_多线程
- JAVA_多线程
- java_多线程
- java_多线程
- Java_多线程
- Java_多线程
- JAVA_多线程
- JAVA_多线程
- java_多线程
- java_多线程
- 第01章 CORE Java_基本格式
- java_多线程死锁
- Java_多线程_简介
- http session
- base方法调用基类构造函数
- VC++实现获取所有的TCP与UDP链接
- jquery mobile 中文在线文档
- MakeFile例子
- java_第13章 多线程(2)
- Exception loading sessions from persistent storage
- 博弈总结
- JMS
- 原码与补码的转换
- 折半查找法的两种实现
- Hadoop实战-初级部分 之 开启云计算之旅 第一部分:我们为什么要学习云计算技术
- 当验证码也被破解,如何才能证明自己是人类?!
- android 获取GPS定位,