知识大全 Java多线程共享数据、同步、通信

Posted

篇首语:天下之事常成于困约,而败于奢靡。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java多线程共享数据、同步、通信相关的知识,希望对你有一定的参考价值。

Java多线程共享数据、同步、通信  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  一 线程共享数据

  a)继承Thread 那么我们可以创建很多个这样的类 但是每个这样的类都是相互不关联的 也就是说我们Thread类中的内容每个创建出来的类都有一份 因此它不适合作为数据共享的线程来操作 同时由于Java继承的唯一性 我们只能继承一个对象

  b)使用runnable就可以解决唯一性和不能共享的问题(不是说使用runnable就解决了共享问题 只是相对于创建Thread来说 它可以算的上是共享了 为了获得更精确的共享问题 它必须的使用线程同步操作) 实现了runnable接口的类比较适合用作共享数据

  一个测试例子à证明runnable能实现数据共享 thread不能

  Thread_thread一个继承了Thread的线程

  Thread_runnable是一个时间了runnable的接口 他们在run里面有共同的方法

  for(int i= ;i< ;i++)

  if(ticket> )

  System out println(ticket);

  ticket ;

  

  

  thread_thread th =new thread_thread();

  thread_thread th =new thread_thread();

  thread_thread th =new thread_thread();

  th start();

  th start();

  th start();

  输入了三组

  因为创建的是三个对象 每一个对象都拥有自己的一个备份

  将一个runnable作为参数 实例化三个thread对象

  thread_runnable ru=new thread_runnable();

  Thread th =new Thread(ru);

  Thread th =new Thread(ru);

  Thread th =new Thread(ru);

  th start();

  th start();

  th start();

  输入了

  虽然说著不是完整意义上的数据共享 但是相当于上述打印三组完整的数据来说 它已经实现了数据共享 我们从中也可以看到 我们只创建了一个runnable对象(数据只产生了一份) 它由三个Thread调用

  新建三个runnable对象 分别给每一个thread传递

  Thread th =new Thread(new thread_runnable());

  Thread th =new Thread(new thread_runnable());

  Thread th =new Thread(new thread_runnable());

  th start();

  th start();

  th start();

  打印结果是

  我们可以看到我们产生了三个runnable对象 每一个都有自己的一份使用

  综上所述 只有将一个runnable对象作为参数 传递给thread对象才能实现数据共享

  注意 当我们创建一个Thread对象 并多次调用start方法的时候 系统是不会给你创建多个Thread线程的 它只会运行那个唯一的Thread一次而已 也就是说你运行了一次start方法之后再调用一个它的start方法是没有意义的(那个Thread没有结束的情况下) 系统不会给你多次运行的

  二 线程同步

  a)线程代码块(在代码中添加Synchronized(对象))

  i Synchronized(对象) 每个对象都有个标志位 当我们进入synchronized代码块中 系统就让这个对象的标志位变为 就相当于给这个对象添加上了一把锁 当别的代码运行到这个代码块的时候因为加了锁 所以不能进去 当第一个程序它运行出去之后 系统就会让标志位变为 相当于解锁 这样别的代码又可以访问了 从而实现同步(安全)操作

  ii 当我们将我们的标志位对象放在run方法里面定义的时候 我们是不能实现同步的 因为我们每次运行一个线程 都将调用它的run方法 从而每次都会创建一个新的标志位对象 也就是说我们所有的run方法都含有自己的一个标志位对象 因此不能实现加锁的过程 一般都是放在runnable接口中进行定义的

  b)线程方法(在代码的方法申明中public和void之间添加synchronized)

  i 每次只能有一个线程调用这个同步方法 而且每次这个方法都得运行完 这就是同步代码方法

  ii 同步方法默认使用的是this来作为标志对象位的 这个this就是我们的当前类

  c)注意

  i 当一个同步代码块和一个同步代码方法使用的不是同一个对象作为标志位的时候 它们就不会实现同步 这也就是数 当两个同步代码块不使用同一个对象作为标志位 那他们就不能实现同步

  ii 调用线程的Start方法的时候 并没有真正的运行这个代码 而只是说这个代码已经准备就绪 有运行的可能

  三 线程通信

  a)当我们的代码中使用了synchronized(对象)同步代码块的时候 如果我们想实现线程通信 也就是如果我们想使用wait notify或者notifyall时 我们必须在静态代码块中使用对象 wait() 对象 notify() 对象 notifyAll()来通信 不然的话讲会报Illegal的错误

cha138/Article/program/Java/gj/201311/27394

相关参考

知识大全 java间的线程通信

  不同线程间进行通信通常有两种简单方法  方法一通过访问共享变量的方式(注需要处理同步问题)  方法二通过管道流  其中方法一有两种实现方法即  方法一a)通过内部类实现线程的共享变量  代码如下 

知识大全 java多线程中synchronized关键字的用法

  由于同一进程内的多个线程共享内存空间在Java中就是共享实例当多个线程试图同时修改某个实例的内容时就会造成冲突因此线程必须实现共享互斥使多线程同步  最简单的同步是将一个方法标记为synchron

知识大全 java的volatile与多线程

  Java语言规范中指出为了获得最佳速度允许线程保存共享成员变量的私有拷贝而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比  Volatile修饰的成员变量在每次被线程访问时都强迫从

知识大全 java破解ip屏蔽+多线程同步拨号

  单线程破解ip屏蔽比较容易只要拨号就行了  多线程抓取数据也比较容易但是引入多线程之后拨号就容易出现问题  多线程抓取的时候这个拨号就比较麻烦一点因为多线程拨号  会出现第一个线程拨号的时候第二个

知识大全 Java的多线程-实现多线程及线程的同步

Java的多线程-实现多线程及线程的同步  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一.实现

知识大全 Java多线程同步具体实例讲解

Java多线程同步具体实例讲解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java多线程同步

知识大全 浅谈Java多线程的同步问题

浅谈Java多线程的同步问题  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  多线程的同步依靠的是

知识大全 Java中多线程之间可以通过接口来实现信息共享

Java中多线程之间可以通过接口来实现信息共享  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  提

知识大全 Java多线程问题之同步器CyclicBarrier

Java多线程问题之同步器CyclicBarrier  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

知识大全 Java多线程的同步示例及对象锁机制

Java多线程的同步示例及对象锁机制  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    java