美文网首页
多线程 以及 线程安全

多线程 以及 线程安全

作者: yanlong107 | 来源:发表于2020-01-15 12:48 被阅读0次

移动端开发过程中,会出现 进程线程的概念,以及多线程中 线程安全 的问题。

进程 和 线程

进程: APP 启动时,应用会启动一个新的 Linux 进程, 一个app内可以有多个进程,进程之间不共享数据。
线程: 1个进程中可以包含多个线程,线程之间数据共享。

多线程 (主线程 和 工作线程)

启动应用时,系统会为该应用创建一个称为“main”(主线程)的执行线程,在和用户交互时,主线程不允许做耗时任务,所以需要后台线程处理这些耗时任务。 这样在应用中就会存在很多的线程,也就是大家说的多线程。

多线程使用示例:

public void onClick(View v) {
    new Thread(new Runnable() {
        public void run() {
            // a potentially time consuming task
            final Bitmap bitmap =
                    processBitMap("image.png");
            imageView.post(new Runnable() {
                public void run() {
                    imageView.setImageBitmap(bitmap);
                }
            });
        }
    }).start();
}


//常用的还有使用线程池
public static final ExecutorService sTheadPoolExecutor
    = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE,
    TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(30),
            new ThreadPoolExecutor.DiscardOldestPolicy());

 private ExecutorService grayThreadPool = Executors.newSingleThreadExecutor();

线程安全

多线程之间,因为共享应用数据。所以在多个线程同时访问数据时,也就会引入线程安全的问题。

多线程安全要解决的问题是,不同线程访问同一数据时的数据安全问题。
解决线程安全的常用方法是增加 synchronized 关键字.

synchronized使用示例:

//synchronized 加在方法上
private synchronized void setNewValue(int a, int b) {
        x = a;
        y = b;
}

//synchronized 加在方法内的代码块上
private void setNewValue(int a, int b) {
    synchronized (monitor1) {
        x = a;
        y = b;
    }
}

1.synchronized保证方法内部或者代码块内部(数据)的互斥访问. 也就是同一时间,只能由1个线程来访问synchronized内的数据
2.synchronized保证线程之间对监视资源的数据同步. 也就是任何线程在获取到 Monitor 后的第⼀时 间,会先将共享内存中的数据复制到⾃自⼰己的缓存中;任何线程在释放 Monitor 的第⼀时间,会先将缓存中的数据复制到共享内存中.

线程数据同步安全中,volatile关键字也是比较常用的, volatile关键字能够保证可见性,被volatile修饰的变量,在一个线程中被改变时会立刻同步到主内存中,而另一个线程在操作这个变量时都会先从主内存更新这个变量的值
volatile使用示例:

private volatile static Singleton mSingleton = null;
private Singleton () {}

public static Singleton getInstance() {
    if (mSingleton == null) {
        synchronized (Singleton.class) {
            if (mSingleton == null) {
                mSingleton = new Singleton();
            }
        }
    }
    return mSingleton;

}

Lock / ReentrantReadWriteLock:
Lock 也是给代码加锁的一种方式, 常用的ReentrantReadWriteLock可以更精细化的管理共享的内存资源。 需要特别注意的是,Lock 的加锁形式需要开发者手动释放锁

private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
private ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock();

private void setValue(int newValue) {
        writeLock.lock();
        try {
            a = newValue;
        } finally {
            writeLock.unlock();
        }
    }

    private void print() {
        readLock.lock();
        try {
            System.out.println("values: " + a);
        } finally {
            readLock.unlock();
        }
    }

END!

相关文章

  • 多线程 以及 线程安全

    移动端开发过程中,会出现 进程 和 线程的概念,以及多线程中 线程安全 的问题。 进程 和 线程 进程: APP...

  • 多线程通信简介

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

  • 多线程(四)

    上篇多线程(三)我们看了多线程的安全隐患 以及各种锁的简单使用,接下来我们来看看锁的比较、以及自旋锁、互斥锁比较 ...

  • 线程安全知多少

    1. 如何定义线程安全 线程安全,拆开来看: 线程:指多线程的应用场景下。 安全:指数据安全。 多线程就不用过多介...

  • 课堂模拟面试试题

    1、列举一下 Cocoa/Cocoa Touch 中常见的几种多线程方案的实现,并谈谈多线程安全的几种解决办法以及...

  • 2018-05-08

    多线程 初级概念与传参 join deatch 原子变量 互斥锁 与 线程安全 线程安全 多线程访问冲突 冲突...

  • iOS关于property中的atomic和nonatomic

    首先这两个属性特质是为了处理多线程安全问题,那么什么是多线程安全,多线程安全就是多个线程访问同一段代码、指针区域、...

  • ConcurrentHashMap

    总结 HashMap在多线程中不安全,java提供了线程安全的ConcurrentHashMap 类,保证在多线程...

  • HashMap相关

    HashMap是数组+链表 1.HashMap不是线程安全,为什么不是线程安全的呢? 多线程put,多线程reha...

  • 几个小问题

    1、FMDB与多线程 SQLITE默认的线程模式是串行模式, 是线程安全的FMDatabase多线程不安全, 单个...

网友评论

      本文标题:多线程 以及 线程安全

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