多线程在实际中的应用:
如何将数据库一个表中的所有记录复制到另一个表中,
- 1 boolean bFlag =true;
- 2 while(bFlag)
- 3 {
- 4 复制程序
- 5 }
复制代码
多线程的同步: 线程安全问题: 问题原因
当多条语句在操作同一个线程共享数据时,一个线程对金条语句只执行 了一部分。还没有执行【无,另一个线程参与进来,导致了共享数据的错误
解决方法
对多条操作共享数据的语句,只能让一个线程都执行完,在执行的过程中,其他线程不可以参与执行
或者说吧:就是一个资源分配的问题。
死锁的必要条件(也是解决线程安全问题的一个方法如果线程出现了死锁我们就可以用下面这些方式来干掉他)
1.互斥地使用资源 第个资源只能给一个进程使用
2.占有且等待资源 一个进程 申请资源得不到满足时处于等待资源的状态,且不释放占用资源
3.非抢夺式分配资源 任何一个进程 不能抢夺另一个线程所占的资源,也就是被占用资源只能由占用线程自己来释放
4循环等待资源 存一组队线程,其实第个线程分别等待另一个进程所占用的资源
对多条操作共享数据语句,只能让一个线程都执行完,在执行过程中其他线程不可以参与执行
java对待这些问题又提供了专业的解决方法
synchronized(对象)
{
需要被同步的代码
}对象如同锁,持有锁的线程可以在同步中执行。没有持有锁的线程
即使获取cpu的执行权,也进不去,因为没有获取锁。
线程睡眠是可以被打断的通过Thread.interrupt()当然一个线程中呆以调用另外一个线程的interrupt(),线程睡眠被打断后进入Runnable状态。由于Thread.sleep()的定义中的
trows关键字声明该方法中有可能引发异常所以我们的程序在调用该方法时必须使用try....catch代码块处理,否则编译将出错。这正是java语句强健性的一个方面。
同步代码块: 如果代码不同步可能会出现很多的安全问题所以我们要想一个办法来解决?那么同步是最好的办法
同步要做到些啥呢?用一个例子来说:就好比宿舍的单人床吧!如果 是两个人睡到一起那么肯定会掉下来一个,所以我们就只能一个一个的睡觉。
也就是程序中有多个线程同时在这两句代码之间但是只能有一个执行。
同步必须满足下面的三个好求:
1 必须要有两个或者两个以上的线程
2 必须是多个线程使用同一个锁
3 必须保证同步代码中只有一个线程在执行
好处:解决了多线程的安全问题。
弊端:耗费内存资源,每次进锁都要判断!也耗费时间
我们必须要明确他的共享数据。执行代码、3 明确多线程运行代码中哪些操语句是操作共享数据的。
synchrinized语句格式 synchrinized(ibject){代码段}//object为任一对象。将具有原子性的代码放入这个语句 内那么就形成了同步代码块。在同一个时刻只能有一个线程可以进入同步代码块内运行。
- // 何问起 hovertree.com
- class ThreadTest implements Runnable
- {
- private int tickets=100;
- String str=new String("");
- public void run()
- {
- while(true)
- {
- synchronized(str)
- {
- if(ticket>0)
- {
- try
- {
- Thread.sleep(10);
- }
- catch(Exception e)
- {
- System.out.println(e.getMessage());
- }
- System.out.println(Thread.currentThread().getName()"is saling ticket"+ticket--);
- }
- }
- }
- }
- }
复制代码
|
|