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

12-24java面向对象之同步和死锁

2014-12-24 20:55 531 查看

案例1

设计一个线程操作类,要求可以产生三个线程对象,并可以设置三个线程的休眠时间

分析:

1.使用Thread类实现
class MyThread extends Thread
{
//封装属性
private String name ;		//定义该线程的名称
private int time;			//定义休眠时间
//构造方法
public MyThread(String name , int time)
{
super(name);
this.time = time;
}
//覆写run方法
public void run()
{
System.out.println(Thread.currentThread().getName() + "休眠开始");
try
{
Thread.currentThread().sleep(this.time);
}
catch (InterruptedException e)
{
System.out.println(Thread.currentThread().getName() +"休眠中断");
}
System.out.println(Thread.currentThread().getName() + "休眠结束" + "持续:" + this.time + "ms");
}
}
public class TestThread16
{
public static void main(String[] args)
{
MyThread mt1 = new MyThread("线程A",1000);
mt1.start();
MyThread mt2 = new MyThread("线程B",2000);
mt2.start();
MyThread mt3 = new MyThread("线程C",3000);
mt3.start();
}
}


1.使用Runnable接口实现

class MyThread implements Runnable
{
//封装属性
private String name ;
private int time ;
//构造方法
public MyThread(String name , int time)
{
this.name = name ;
this.time = time ;
}
public String getName()
{
return this.name ;
}
//覆写run方法
public void run()
{
System.out.println(this.name + "休眠开始");
try
{
Thread.currentThread().sleep(this.time);
}
catch (InterruptedException e)
{
System.out.println(this.name +"休眠中断");
}
System.out.println(this.name + "休眠结束" + "持续:" + this.time + "ms");
}
}
public class TestThread17
{
public static void main(String[] args)
{
MyThread mt1 = new MyThread("线程A",1000);
new Thread(mt1).start() ;
MyThread mt2 = new MyThread("线程B",2000);
new Thread(mt2).start() ;
MyThread mt3 = new MyThread("线程C",3000);
new Thread(mt3).start() ;
}
}


同步

问题的引出:把各个售票点理解为线程,那么各个线程需要共享资源。如果引入延时,系统可能存在负数的问题。

class Sale implements Runnable
{
private int ticket = 5;
public void run()
{
for (int i =0;i<50 ; ++i )
{
if (ticket>0)
{
System.out.println("买票成功,还剩下票数 ticcket=" + ticket--);
}
}
}
}
public class TestChronized1
{
public static void main(String[] args)
{
Sale s = new Sale();
Thread th1 = new Thread(s);
Thread th2 = new Thread(s);
Thread th3 = new Thread(s);
th1.start();
th2.start();
th3.start();
}
}


下面引入延时

class Sale implements Runnable
{
private int ticket = 5;
public void run()
{
for (int i =0;i<50 ; ++i )
{
if (ticket>0)
{
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("买票成功,还剩下票数 ticcket=" + ticket--);
}
}
}
}
public class TestChronized1
{
public static void main(String[] args)
{
Sale s = new Sale();
Thread th1 = new Thread(s);
Thread th2 = new Thread(s);
Thread th3 = new Thread(s);
th1.start();
th2.start();
th3.start();
}
}


结果



要想解决数据共享问题——使用同步代码块或同法方法。

同步代码块

class Sale implements Runnable
{
private int ticket = 5;
public void run()
{
for (int i =0;i<50 ; ++i )
{
synchronized (this)
{
if (ticket>0)
{
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("买票成功,还剩下票数 ticcket=" + ticket--);
}
}
}
}
}
public class TestChronized2
{
public static void main(String[] args)
{
Sale s = new Sale();
Thread th1 = new Thread(s);
Thread th2 = new Thread(s);
Thread th3 = new Thread(s);
th1.start();
th2.start();
th3.start();
}
}


同步代码块:

Synchronized (同步对象){}

其中同步对象一般使用this代替

同步方法

class Sale implements Runnable
{
private int ticket = 5;
public void run()
{
for (int i =0;i<50 ; ++i )
{
saleTicket();
}
}
public synchronized void saleTicket()
{
if (ticket>0)
{
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println("买票成功,还剩下票数 ticcket=" + ticket--);
}
}
}
public class TestChronized3
{
public static void main(String[] args)
{
Sale s = new Sale();
Thread th1 = new Thread(s);
Thread th2 = new Thread(s);
Thread th3 = new Thread(s);
th1.start();
th2.start();
th3.start();
}
}


结果完全相同

Synchronized 方法返回值 方法() {}

死锁

不同的线程在互相等待

总结:
只要数据共享就需要同步

过分同步就会产生死锁
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: