码迷,mamicode.com
首页 > 编程语言 > 详细

线程的同步和安全

时间:2014-11-13 00:22:33      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:blog   http   ar   使用   java   sp   数据   div   on   

如果多个线程同时运行同一个线程体,每次运行的结果可能都不一样

class MyThread implements Runnable{
	int i = 10;
	public void run(){
		while(true){
		//获取当前运行线程的名字
			System.out.println(Thread.currentThread().getName() + i);
			i--;
			Thread.yield();
			if(i < 0){
				break;
			}
		}
	}
}
class Test{
	public static void main(String args[]){
		MyThread mt = new MyThread();
		//生成共用同一线程体的两个线程对象
		Thread t1 = new Thread(mt);
		Thread t2 = new Thread(mt);
		//设置线程名字
		t1.setName("A线程:");
		t2.setName("B线程:");
		//分别启动两个线程
		t1.start();
		t2.start();
	}
}

bubuko.com,布布扣

根据上图我们知道结果明显有错误,这就是多线程运行访问同一份数据时出现的错误。错误原因:AB线程轮流运行,假设B线程先运行了几行代码后(打印B线程:10)轮到A线程运行。A线程运行线程体后也打印A线程:10

为解决这个问题,我们使用java关键字:synchronized

class MyThread implements Runnable{
	int i = 10;
	public void run(){
		while(true){
			//同步代码块
			synchronized(this){
				//获取当前运行线程的名字
				System.out.println(Thread.currentThread().getName() + i);
				i--;
				Thread.yield();
				if(i < 0){
					break;	
				}
			}
		}
	}
}

bubuko.com,布布扣

使用同步代码块后,当A线程执行线程体时,获得了对象锁的使用权,即使A线程运行到yield方法时仍持有这个锁的使用权,B线程没有得到对象锁的使用权,则需要等待A线程执行完线程体释放对象锁。当B线程获得了对象锁的使用权后A线程也需要等待。线程的同步是为了防止多个线程访问同一数据时,对数据造成的破坏。

 

总结:

1.多线程访问同一对象中的同步代码块时,一个时间内只能有一个线程运行,其他线程对同步代码块的访问被阻塞,必须等待当前线程执行完同步代码块的内容

2.当一个线程访问同步代码块时,其他线程仍然可以访问非同步代码块的部分

3.每个对象只有一个锁。线程睡眠时也不会释放锁

 

线程的同步和安全

标签:blog   http   ar   使用   java   sp   数据   div   on   

原文地址:http://www.cnblogs.com/chavez-wang/p/4093734.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!