Java线程的同步和通讯

来源:互联网 发布:天书世界坐骑进阶数据 编辑:程序博客网 时间:2024/05/17 22:19

           当两个或两个以上的线程需要共享资源,它们需要某种方法来确定资源在某一刻仅被一个线程占用。达到此目的的过程叫做同步(synchronization)。像你所看到的,Java为此提供了独特的,语言水平上的支持。同步的关键是管程(也叫信号量semaphore)的概念。管程是一个互斥独占锁定的对象,或称互斥体(mutex)。在给定的时间,仅有一个线程可以获得管程。当一个线程需要锁定,它必须进入管程。所有其他的试图进入已经锁定的管程的线程必须挂起直到第一个线程退出管程。这些其他的线程被称为等待管程。一个拥有管程的线程如果愿意的话可以再次进入相同的管程。在java程序中实现同步必须对共享的资源使用synchronized关键字,如:

class Demo{

      synchronized void test(){

//方法体}

}

或者是在调用该资源的时候使用关键字:

class Test implements Runnable {

Demo demo;

public void run(){

synchronized(demo){

demo.test();}

}

}

     当然实现同步的关键必须让共享的资源同时让需要同步的单位同时享有机会。

        说道线程,不由得就会想到进程,毕竟在尚未接触这门语言的时候我们启动任务管理器的时候,特别是在程序卡死重启的过程中,系统提示程序还是运行,就需要打开第二栏的进程管理,从而结束进程,扯远了,在学到线程的时候,或许对理解进程乃至程序、计算机传输数据可能都会有一些模糊的概念了,对比二者确实有很多相似之处,二者的关系如同主水管接了很多分支,然后分支又分支,再分支的或许就是线程了,而进程就是分支,通过这个对比便能很好的理解线程和进程了,首先是线程肯定是要被进程所包含的,Java也能够被看成是一个进程,而线程是可以共享资源的进程是不能够的,进程是一个独立的运行环境,线程可以看做是轻量级的进程。

        说到通讯问题,这事情瞬间就高大上了,到底是发微信,还是微博私信呢?看来都不是,就是在它耳边轻轻的说就行了,老师举得例子是生产和消费的通讯问题,生产和消费的中间放着的便是产品了,所以通讯的前提还是得同步,也就是当下比较流行的信息对称的意味,然后就得通过一些方式来判断了,比如生产者先生产一个商品,然后在通知消费者前来消费,这里就很考究了, 调用的是notify()方法,前来通讯的,当然也可以判断,当生产者没有商品的时候,救通知消费者等一等使用wait()方法,在这里补充一下(wait(),notify(),notifyAll()不属于Thread类,而是属于Object基本类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.)对于消费者是一样的,就这样完成了通讯的过程,具体例子在上一篇。

0 0
原创粉丝点击