我也进来复习了哥们 不过我认为你应该在加上
同步的前提:
1、必须要有两个或者两个以上的线程。
2、必须是多个线程使用同一个锁。
同步函数的锁是this
静态同步函数的锁是Class对象
单例设计模式之懒汉式:
class Single
{
private Single(){}
private static Single single = null;
public staticSingle getInstance()
{
if(single==null)
{//避免每次都判断锁,只有当对象为null的情况下才判断
synchronized(Single.class)
{
if(single==null)/*如果一个线程跑到第一个if后死了,另一个线程进来创建了对象释放了锁,然后那个线程醒了,进来后还要判断*/
single =new Single();
}
}
return single;
}
}
wait() notify() notifyAll()都是用在同步中,因为要对持有监视器(锁)的线程操作,所以使用在同步中,因只有同步中有锁。
为什么这些操作线程的方法要定义在object类中呢?
答:因为这些方法在操作同步中的线程时,都必须要标示他们所操作线程只有的锁。
只有同一个锁上的被等待线程可以被同一个锁上的线程被notify唤醒。同时不可以对不同所中的线程进行唤醒。
也就是说等待和唤醒必须是同一个锁。而锁可以是任意对象,所以可以被任意对象调用的方法定义在object中。
Notify():往往唤醒线程池中的第一个,所以可能唤醒本方导致数据错乱全部等待。可以用notifyall全部唤醒。
当出现多个生产者消费者同时要做这件事情的时候要用循环while和notifyall,(通用1.while判断标记,2.把对方唤醒)当只有一个生产者和消费者时可以用if
停止线程:Stop方法已过时,如果停止线程呢:只有一种,run()方法结束
原理:开启多线程运行,运行代码通常是循环。只要控制循环,皆可以让run方法结束即线程结束。
守护线程:线程对象.setDaemon(true);将该线程标记为守护线程或用户线程。
当正在运行的线程都是守护线程时,Java虚拟机退出,程序结束。
多线程(Join方法)
特点:当A线程执行到了B线程的.join()方法时,那么A线程就会等待B线程都执行完A才会执行。它可以用于临时加入线程执行
|