------- <ahref="http://edu.csdn.net/heima" target="blank">android培训</a>、<ahref="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------
进程是一个正在执行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元。
线程就是进程中的一个独立控制单元,线程控制着进程的执行,一个进程至少有一个线程。Java虚拟机启动时会有一个进程java.exe,该进程至少有一个线程负责java的执行,jvm启动不止一个线程,其中垃圾回收机制可能也在运行。
getName()用于获取线程名称;设置线程名称用setName()。
实现方式和继承的区别:实现可以避免单继承的局限性。定义线程时使用实现方式。
继承Thread,线程代码存放在子类run方法中;实现Runnable,线程代码存放在接口子类的run方法中。
对象如同锁,持有锁的线程可以在同步中执行;没有持有锁的线程即使获取cpu的执行权也进不去,因为没有锁。
同步的前提:1、必须要有两个或两个以上的线程;2、必须是多个线程使用同一个锁。
同步的好处:解决了多线程的安全问题;同步的弊端:多个线程需要判断锁,较为消耗资源。
写同步要明确几点:一是哪些代码是多线程运行代码;二是哪些是共享数据;三是多线程运行代码中哪些语句是操作共享数据的。
同步可修饰代码块,也可修饰函数。函数需要被对象调用,那么函数都有一个所属对象引用,就是this,则同步函数使用的锁是this。
wait、notify()、notifyAll(),都使用在同步中,因为要对监视器(锁)的线程操作,所以要使用在同步中,只有同步才具有锁。这些方法在操作同步中线程时,都必须标识它们所操作线程的锁,只有同一个锁上的等待线程,可以被同一个锁上的notify()唤醒,不可以对不同锁中的线程进行唤醒。
等待和唤醒必须是同一个锁,而锁可以是任意对象,可以被任意对象调用的方法定义在Object类中。
JDK1.5中提供了多线程升级解决方案:将同步synchronized替换成显式Lock操作,将Object中的wait、notify、notifyAll替换成了condition对象。该对象可以被Lock锁,进行获取。
join的用法:当A线程执行到了B线程的.join()方法时,A就会等待。等B线程执行完,A才会执行。join可用来临时加入线程执行。
如果同步函数被静态修饰后,使用的锁是该方法所在类的字节码文件,类名.class。
静态进内存时内存中没有本类对象,但一定有该类对应的字节码文件对象。
懒汉式特点是延迟加载,问题是容易出现安全问题,解决办法是加同步解决。
用同步代码块较低效,用双重否定可解决效率问题。
请写一个单例设计模式下的延迟加载实例:
If(s==null)
{
synchronized(single.class)
{
if(s==null)
s=new single();
}
}
class Single
{
private static Single s=null;
private Single()
{|
}
public static Single getInstance()
{
If(s==null)
{
synchronized(Single.class);
{
if(s==null)
s=new Single();
}
}
}
}
请写一个死锁程序:
class Test
{
private boolean flag;
Test(boolean flag)
{
this.flag=flag;
}
public void run()
{
if(flag)
{
synchronized(Mylock.locka)
{
System.out.println(“iflocka”);
synchronized(Mylock.lockb)
{
System.out.println(“iflockb”);
}
}
}
else
{
synchronized(Mylock.lockb)
{
System.out.println(“elselockb”);
synchronized(Mylock.locka)
{
System.out.println(“elselocka”);
}
}
}
}
}
class Mylock
{
static Object locka=new Object();
static Object lockb=new Object();
}
classDeadLockTest
{
public static void main(String[] args)
{
Thread t1=new Thread(newTest(true));
Thread t1=new Thread(newTest(false));
t1.start();
t2.start();
}
}
------- <ahref="http://edu.csdn.net/heima" target="blank">android培训</a>、<ahref="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------