您的位置:首页 > 编程语言

线程安全性问题---->同步代码块

2015-12-09 00:00 246 查看
线程安全性问题产生的原因:

---->有多个线程在操作共享数据。

当一个线程在执行操作共享数据的多条代码过程中,其他线程也参与了运算。就会导致线程安全问题产生。

解决思路:

将多条操作共享数据的线程代码 封装起来,当有线程在执行这些代码的时候,其他线程不参与运算

必须当前线程把这些代码执行完毕后,其他线程才可以运算。

在java中使用同步代码块解决此问题

同步代码块格式:

synchronized(对象)

{需要被同步的代码}

同步代码块的好处:解决了线程的安全性问题

同步代码块的弊端:相对降低了效率,因为同步外的线程都会判断同步锁

package org.panda.Thread;

public class TicketDemo02
{

public static void main(String[] args)
{
Ticket t = new Ticket() ; //实例化Ticket对象
Thread t1 = new Thread(t) ;
Thread t2 = new Thread(t) ;
t1.start();
t2.start();
}

}
class Ticket1 implements Runnable
{
private int num = 100 ; //声明类的属性,并赋值
public void run() 		//覆盖run()方法,封装线程任务
{
while(true)
{
synchronized(this)//同步代码块,对当前对象进行同步 this表示当前对象
{
if(num>0)
{
try
{
Thread.sleep(10); //增加延迟
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"...sale..."+(num--));
}
}
}
}
}


需求:两个 储户,到一个银行存钱,每次存100 各存 3 次

package org.panda.Thread;

public class SaveMoneyDemo01
{
public static void main(String[] args)
{
Cons c = new Cons() ;
Thread t1 = new Thread(c) ;
Thread t2 = new Thread(c) ;
t1.start();
t2.start();
}
}
class Bank		//创建银行类
{
private int sum ; 					  //定义类属性 表示总数
public synchronized void add(int num) //同步函数
{
sum = sum + num ;				  //求出累加和
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("sum= "+sum);
}
}
class Cons implements Runnable
{
private Bank b = new Bank() ;		//实例化Bank对象
public void run()
{
for(int i=0;i<3;i++)
{
b.add(100);					//调用银行方法每次存款100
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: