java提供了同步方式来完成线程安全问题的解决.
1,同步原理:
其实就是通过带锁的代码块将容易出现安全问题的代码进行封装。
2,同步好处:
解决了线程安全问题。
3,同步弊端:
1,降低了运行效率。(判断锁是较为消耗资源的)
2,同步嵌套,容易出现死锁。
4,同步的表现形式:
1,同步代码块。
synchronzied(对象锁){
需要被同步的代码。(哪些需要同步哪些不需要一定要分清)
}
2,同步函数。
就是在函数上加了synchronzied关键字进行修饰。、
同步代码块可以使用任意对象作为锁。
同步函数使用的锁只有一个,就是this。
注意:static同步函数使用的锁是该函数所属类的对象。类名.class
5,同步前提:
1,必须是两个或者两个以上的线程。
2,多个线程必须使用同一个锁。
有一个比喻:火车上的卫生间。
----------------------------------------------------
单例设计模式中的懒汉式:
classSingle
{
privatestatic Single s = null;
privateSingle(){}
publicstatic Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s= new Single();
}
}
returns;
}
}
---------------------------------------------------
线程间的通信。
两个或者两个以上的线程在处理同一个资源时,处理动作是不一样的。
这时就需要将动作代码分别存放在不同的run方法,而run方法要封装单独的类中。
示例:生产者,消费者。
--------------------------------------------------
在同步中的使用的方法。
wait,notify,notifyAll。这三个方式都定义Object类中。
wait:让当前线程处于等待(冻结状态)状态。将该线程存入到了线程池中。
notify:唤醒被等待的线程。通常唤醒的是线程池中的第一个。
notifyAll:唤醒线程池中所有被等待线程。
这些方法要用在同步中。并要明确三个方法所属的同步锁。
synchronized(obj)
{
obj.wait();
obj.notify();
}
在同步中无论被等待多少个线程,同时唤醒后,
注意:只可能有一个线程会持有锁,并执行。其他线程即使子啊同步块中,也执行不了。
---------------------------------------------------
wait(): 释放cpu的执行权。释放锁。
sleep():释放cpu的执行权。不释放锁。
---------------------------------------------------
线程类中的常见方法:
1,线程名称,通过Thread类的构造函数,指定名称,或者通过setName来完成。
2,优先级:setPriority(int);MAX_PRIORITY,MIN_PRIORITY,NORM_PRIORITY
3,将线程标记为守护线程(后台线程):setDaemon(true); 注意该方法要在线程开启前使用。
和前台线程一样开启,并抢资源运行,
所不同的是:当前台线程都结束后,后台线程会自动结束。无论后台线程处于什么状态都会自动结束。
4,join方法:让线程加入执行。执行某一线程join方法的线程会被冻结。
等待某一线程执行结束,该线程才会恢复到可运行状态。
5,yield():可以对线程进行临时暂停,其实就是让线程临时将资源释放出来。
---------------------------------------------------
结束线程。
很遗憾:stop方法因为安全原因,以后过时。
所以结束线程原理就一个:就是让run方法结束。而run方法中通常会定义循环结构。
所以只要控制住循环即可。
那么可以boolean标记的形式完成。
只要在某一情况下将标记改变,让循环停止即可让线程结束。
但是,特殊情况,线程在运行过程中,处于了冻结状态,是不可能读取标记的。
那么这时,可以通过正常方式恢复到可运行状态,
也可以强制让线程恢复到可运行状态,通过Thread类中的,
interrupt():清除线程的冻结状态,但这种强制清除会发生InterruptedException.
所以在使用 wait,sleep,join方法的时候都需要进行异常处理。
------------------------------------------------------
多线程在开发中的应用:
1,下载。
2,聊天。
3,多个客户端访问web服务器的时候,web服务器会将客户端的请求封装到一个线程中。
这样多个客户端请求才可以同时访问web服务器,并运行web服务器程序。
多线程在代码中的体现形式之一:
classDemo
{
publicstatic void main(String[] args)
{
newThread()
{
publicvoid run()
{
for(intx=0; x<100; x++)
{
System.out.println("a="+x);
}
}
}.start();
for(intx=0; x<100; x++)
{
System.out.println("b="+x);
}
Runnabler = new Runnable()
{
publicvoid run()
{
for(intx=0; x<100; x++)
{
System.out.println("c="+x);
}
}
};
newThread(r).start();
}
}
什么时候使用多线程呢?
当多部分代码需要同时执行的时候,就使用多线程技术。
线程类中的方法:
1,线程的优先级:可以提高线程抢到资源的频率。
setPriority(int):对优先级进行设定,1~10之间。
2,自定义线程名称。可以通过Thread构造函数,也可以通过setName
3,将线程标记为守护线程。也称为后台线程。
线程分:前台线程和后台线程,当前台线程都运行完时,无论是否有后台线程还在存活都会结束,jvm都会结束。
setDaemon(boolean);
4,join(): 主线程调用了t1.join()方法,那么主线程会释放资源(执行权),等待t1线程结束后,在进行执行。
那么这时主线程是处于冻结状态的。只有t1结束它才会恢复到可运行状态。
可以用于临时加入一个线程,并让其执行完。
1274

被折叠的 条评论
为什么被折叠?



