多线程:一个进程里有多个线程同时在运行,称之为多线程
有多条执行路径的程序我们称之为多线程。例如:迅雷下载,多个程序同时在下载
多线程出现的好处:1,提高了效率。2,可以多个程序同时运行。
而在程序开发中如果有多部分代码要同时运运行需要加入多线程技术。
在Java中创建多线程有2种方式:
1,继承Thread类。(因为Thread类就是描述线程的)复写run方法将要运行的代码放到run方法中,
在Main主函数中创建Thread子类对象,并调用start()方法,这样线程就开启了。
2,实现Runnable接口,复写run方法,在主函数中创建接口子类对象,创建Thread对象跟接口子类对象相关联,而后调用start()方法。(start()和run方法的区别:start()是开启线程,而run方法仅仅是对象调用,线程创建了但还没开启)。
多线程的运行会出现安全问题:
问题的原因:当多条语句在操作一个线程的共享数据时,一个线程的多条语句还没执行完,另一个线程参与进来了,导致共享数据错误。
解决方法:
多条语句操作一个线程,先让这个线程运行完,别的线程才能参与运算。
同步的前提:必须要有2个或2个以上的线程同时运行,
要保证锁的唯一性,多个线程是不是共享同一把锁。
同步的好处:提高了安全性;
弊端:会比较消耗资源,因为每次都要判断锁。
效率会低。
死锁的出现:同步嵌套同步会产生死锁。
写个死锁程序:
class Lock implements Runnable
{
boolean blag;
Lock(boolean blag)
{
this.blag=blag;
}
public void run()
{
if(blag)
{
synchronized(MyLock.Locka)
{
System.out.println("Loacka:::");
synchronized(MyLock.lockb)
{
Systm.out.println("Lockb;;;");
}
}
}else
{
synchronized(MyLock.lockb)
{
System.out.println("Lockb;;;");
synchronized(MyLock.locka)
{
System.out.println("Locka:::::");
}
}
}
class MyLock
{
static Object lacka= new Object();
static Object lockb = new Object();
}
class LockDemo
{
public static void main(String[] args)
{
new Thread(new Lock(true)).start();
new Thread(new Lock(flase)).start();
}
}
单例设计模式:懒汉式
class Single
{
private Single(){};
private static Single s= null;
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
{
s=new Single();
}
}
}
return s;
}
}
|
|