黑马程序员技术交流社区
标题:
多线程以及多线程安全问题的解决
[打印本页]
作者:
王春蕾
时间:
2014-4-14 20:30
标题:
多线程以及多线程安全问题的解决
/*
创建线程的第二种方式
1、实现Runnable接口
2、覆盖run方法
3、通过Thread类创建线程对象
4、将Runnable接口的子类对象作为实参传递给Thread类中的构造函数
5、调用start方法开启线程,并运行Runnable接口的run方法
第二种实现Runnable接口创建线程的思想:
将线程任务和线程对象进行解耦,将线程任务单独封装成对象。
另外,实现Runnable接口可以避免单继承的局限性。
所以建议创建多线程时实现Runnable接口的方式。
*/
/*
线程安全问题:
原因:
1、多个线程在同时处理共享数据
2、线程任务中有多条代码在操作共享数据
安全问题的成因就是:
一个线程在通过多条操作共享数据的过程中,其它线程也参与了
共享数据的操作,导致了数据的错误。
想要知道你的多线程程序有没有安全问题:
只要看线程任务中是否有多条代码在处理共享数据。
解决多线程安全问题的方法:
一个线程在通过多条语句操作共享数据的过程中,不允许其它
线程参与运算
如何用代码体现?
Java中提供了同步代码块进行引起安全问题的代码封装
格式:
synchornized(对象)
{
需要被同步的代码
}
同步的优缺点:
好处:解决了多线程的安全问题
弊端:降低了效率
同步的前提:
1、至少有两个线程在同步中。
2、必须保证同步使用的是同一个锁
同步函数和同步代码块的区别
1、同步函数使用的是固定锁this。
2、同步代码块使用的锁是可以指定的。
静态同步函数使用的锁是什么?
就是所在类的类名.class字节码文件对象。
*/
class ThreadDemoSolve
{
public static void main(String[] args)
{
Ticket t1=new Ticket();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
//System.out.println("Hello World!");
}
}
class Ticket implements Runnable
{
private static int num=100;
Object obj=new Object();
/*
同步的第二种表现形式
同步函数
*/
public static synchronized void sale()
{
if(num>0)
{
/*让线程小睡一会,如果此时CPU切换到其它程序的执行权
就会让线程暂时“困”在这里,此时如果有其它线程进入,
也有可能会出现被困现象,待CPU切换到该线程的执行权时,
num的值已经改变,此时运行结果就很有可能出现“灵异”现象
*/
try{Thread.sleep(20);}
catch(InterruptedException e )
{
System.out.println(e);
}
System.out.println(Thread.currentThread().getName()+"Sale:"+num--+"this...");
}
}
public void run()
{
while(true)
{
//synchronized(obj)
//{
this.sale();
if(num<=0)
{
//Thread.currentThread().stop();
return;
}
//}
}
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2