线程的同步

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方法要封装单独的类中。

示例:生产者,消费者。

--------------------------------------------------

在同步中的使用的方法。

waitnotifynotifyAll。这三个方式都定义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); 注意该方法要在线程开启前使用。

和前台线程一样开启,并抢资源运行,

所不同的是:当前台线程都结束后,后台线程会自动结束。无论后台线程处于什么状态都会自动结束。

4join方法:让线程加入执行。执行某一线程join方法的线程会被冻结。

等待某一线程执行结束,该线程才会恢复到可运行状态。

5yield():可以对线程进行临时暂停,其实就是让线程临时将资源释放出来。

---------------------------------------------------

结束线程。

很遗憾:stop方法因为安全原因,以后过时。

所以结束线程原理就一个:就是让run方法结束。而run方法中通常会定义循环结构。

所以只要控制住循环即可。

那么可以boolean标记的形式完成。

只要在某一情况下将标记改变,让循环停止即可让线程结束。

但是,特殊情况,线程在运行过程中,处于了冻结状态,是不可能读取标记的。

那么这时,可以通过正常方式恢复到可运行状态,

也可以强制让线程恢复到可运行状态,通过Thread类中的,

interrupt():清除线程的冻结状态,但这种强制清除会发生InterruptedException.

所以在使用 waitsleepjoin方法的时候都需要进行异常处理。

------------------------------------------------------

多线程在开发中的应用:

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);

4join(): 主线程调用了t1.join()方法,那么主线程会释放资源(执行权),等待t1线程结束后,在进行执行。

那么这时主线程是处于冻结状态的。只有t1结束它才会恢复到可运行状态。

可以用于临时加入一个线程,并让其执行完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值