美文网首页
多线程之线程通信

多线程之线程通信

作者: vaneL | 来源:发表于2017-08-03 21:19 被阅读0次
  1. 通过共享对象通信
    线程间发送信号的一个简单方式是在共享对象的变量里设置信号值。
  2. 忙等待(Busy Wait)
    准备处理数据的线程B正在等待数据变为可用。换句话说,它在等待线程A的一个信号
  3. wait(),notify()和notifyAll()
    忙等待没有对运行等待线程的CPU进行有效的利用,除非平均等待时间非常短。否则,让等待线程进入睡眠或者非运行状态更为明智,直到它接收到它等待的信号。
    Java有一个内建的等待机制来允许线程在等待信号的时候变为非运行状态。java.lang.Object 类定义了三个方法,wait()、notify()和notifyAll()来实现这个等待机制。
  4. 丢失的信号(Missed Signals)
    notify()和notifyAll()方法不会保存调用它们的方法,因为当这两个方法被调用时,有可能没有线程处于等待状态。通知信号过后便丢弃了。因此,如果一个线程先于被通知线程调用wait()前调用了notify(),等待的线程将错过这个信号。这可能是也可能不是个问题。不过,在某些情况下,这可能使等待线程永远在等待,不再醒来,因为线程错过了唤醒信号。
  5. 假唤醒
    为了防止假唤醒,保存信号的成员变量将在一个while循环里接受检查,而不是在if表达式里。这样的一个while循环叫做自旋锁。
  6. 多个线程等待相同信号
  7. 不要在字符串常量或全局对象中调用wait()
    所以:在wait()/notify()机制中,不要使用全局对象,字符串常量等。应该使用对应唯一的对象。

● 静态变量:线程非安全。
静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。
● 实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。
实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。
● 局部变量:线程安全。
每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

public class ThreadShareData {
    private static int data=0;
    private static Map<Thread,Integer> threadData=new HashMap<Thread,Integer>();

    public static void main(String[] args) {
        for (int i = 0; i < 2; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    data = new Random().nextInt() ;
                    System.out.println(Thread.currentThread().getName() + ":" + data);
                    threadData.put(Thread.currentThread(),data);
                    new A().get();
                    new B().get();
                }
            }).start();
        }
    }
    static class A{
        public void get(){
            data=threadData.get(Thread.currentThread());
            System.out.println("A--"+Thread.currentThread().getName()+":"+data);
        }
    }
    static class B{
        public void get(){
            data=threadData.get(Thread.currentThread());
            System.out.println("B--"+Thread.currentThread().getName()+":"+data);
        }
    }
}

输出结果:
Thread-1:308764307
Thread-0:499909925
A--Thread-1:499909925
A--Thread-0:499909925
B--Thread-0:499909925
B--Thread-1:499909925

private static int data=0;
private static Map<Thread,Integer> threadData=new HashMap<Thread,Integer>();
threadData是一个HashMap,同一个线程只能放一个data。

相关文章

  • Java基础知识02- 线程

    多线程通信 :什么是多线程通信 ?怎么进行通信 ? 多线程通信就是多个线程同时操作同一个全局变量,但是操作的动作不...

  • java基础-day22-多线程、线程通信和线程池

    多线程,线程通信和线程池 1. 多线程 1.1 线程状态 1.2 Object类中的方法 2. 线程通信 生产者消...

  • Java多线程的使用通信和控制

    Java多线程的使用通信和控制 1. Java多线程的使用和通信 实现多线程有两种方式 1. 继承Thread父类...

  • 多线程通信简介

    这里是对学习的多线程通信做个记录.之前也对多线程安全 以及 Android 中多线程通信进行了接受,可以前往查看...

  • Java多线程:synchronized的可重入性

    从Java多线程:线程间通信之volatile与sychronized这篇文章中我们了解了synchronized...

  • 我看谁还不懂多线程之间的通信+基础入门+实战教程+详细介绍+附源

    一、多线程之间的通信(Java版本) 1、多线程概念介绍 多线程概念 在我们的程序层面来说,多线程通常是在每个进程...

  • 多线程

    简单讲解了关于多线程的一些应用:线程进程的概念区别,定义多线程,多线程之间的通信,线程的死锁,以及线程的优先级。此...

  • iOS - 线程 / 进程 的通信

    1. 线程中的通信 线程中通信的体现 在iOS多线程开发中,有NSThread、GCD、NSOpeartion几种...

  • 线程通信的方法

    线程通信的方法 程序在使用多线程执行任务时,经常需要线程之间协同工作。此时,我们需要了解线程通信的手段。 线程通信...

  • GCD练习

    GCD练习 ios 多线程 GCD : ios 多线程 全剧队列,异步执行 线程间通信 信号量 文件锁 单利模式 ...

网友评论

      本文标题:多线程之线程通信

      本文链接:https://www.haomeiwen.com/subject/kkkmlxtx.html