今天来介绍一下android中多线程同步的机制

首先我们来创建几个多线程,模仿一下文件读写的操作。

private void writeLog() {for (int i = 0; i < 3; i++) {try {Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "写入中");
            Thread.sleep(new Random().nextInt(1000));
            Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "写入完成");
        } catch (InterruptedException e) {e.printStackTrace();
        }}
}private void readLog() {for (int i = 0; i < 3; i++) {try {Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "读取中");
            Thread.sleep(new Random().nextInt(1000));
            Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "读取完成");
        } catch (InterruptedException e) {e.printStackTrace();
        }}
}

这俩个方法分别是模拟写入和读取的操作,由于读写操作一般都是有耗时的操作,所以这里使用sleep来代替时间。

接下来创建俩个Runnable的实现类。

class StuThread1 implements Runnable {@Override
    public void run() {writeLog();
    }
}class StuThread2 implements Runnable {@Override
    public void run() {readLog();
    }
}

第一个进行写入,第二个进行读取。

接下来来循环创建线程

StuThread1 stuThread1 = new StuThread1();
StuThread2 stuThread2 = new StuThread2();
for (int i = 0; i < 2; i++) {new Thread(stuThread1).start();
    new Thread(stuThread2).start();
}

这时运行的结果如下

showLog: Thread-7写入中
showLog: Thread-8读取中
showLog: Thread-5写入中
showLog: Thread-6读取中
showLog: Thread-7写入完成
showLog: Thread-7写入中
showLog: Thread-8读取完成
showLog: Thread-8读取中
showLog: Thread-7写入完成
showLog: Thread-7写入中
showLog: Thread-6读取完成
showLog: Thread-6读取中
showLog: Thread-6读取完成
showLog: Thread-6读取中
showLog: Thread-5写入完成
showLog: Thread-5写入中
showLog: Thread-7写入完成
showLog: Thread-6读取完成
showLog: Thread-8读取完成
showLog: Thread-8读取中
showLog: Thread-8读取完成
showLog: Thread-5写入完成
showLog: Thread-5写入完成

很明显这时的线程是不同步的,如果真的在进行读写操作一定出现数据混乱(如果这里面的操作要是与钱有关,那你就摊上大事了....)

现在来介绍一下俩种同步的方式

1.使用synchronized关键字。

2.使用lock这个锁的对象。

synchronized这个关键字可以直接加到方法上也可使用synchronized代码块,将需要同步的代码放到这个代码块中,如:

private synchronized void writeLog() {for (int i = 0; i < 3; i++) {try {Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "写入中");
            Thread.sleep(new Random().nextInt(1000));
            Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "写入完成");
        } catch (InterruptedException e) {e.printStackTrace();
        }}
}private void readLog() {synchronized (this) {for (int i = 0; i < 3; i++) {try {Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "读取中");
                Thread.sleep(new Random().nextInt(1000));
                Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "读取完成");
            } catch (InterruptedException e) {e.printStackTrace();
            }}}
}

这俩种方式的作用是一样的。这时加了同步锁的输出结果为:

这时的输出结果就是我想要的结果。

使用synchronized关键字修饰的方法会同步执行,必须要等上一个synchronized执行完才会继续执行,如果在执行过程中线程阻塞,他就会一直保持等待的状态,在这里不特别推荐使用这种方式,如果你的需求是必须保证数据同步的情况下且保证不会出现其他情况使用户无法完成操作的情况下可以使用时,可以使用。这个关键字一般用于单例模式保证线程安全时使用。无需手动释放或关闭,当操作完成后自动释放引用

2.Lock方式

首先我们要创建一个Lock的对象

private Lock lock = new ReentrantLock();

这里我们创建的是一个ReentrantLock的对象 ,具体为什么创建这个对象我也不是很清楚。

这里也有其他实现类,这个lock本身是一个接口。他的实现类有三个

这里就不做具体介绍了。这里主要介绍一下使用的方式

private void writeLog() {for (int i = 0; i < 3; i++) {try {lock.lock();
            Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "写入中");
            Thread.sleep(new Random().nextInt(1000));
            Log.e(TAG, "showLog: " + Thread.currentThread().getName() + "写入完成");
        } catch (InterruptedException e) {e.printStackTrace();
            Log.e(TAG, "writeLog: " + lock.tryLock());
        } finally {lock.unlock();
        }}
}

创建对象后使用lock.lock()方法进行加锁,注意:这个lock必须要在finally代码块中进行unlock()的操作。如果不进行手动释放这锁会一直存在引用,会造成很多意想不到的问题。具体的问题就不多说了,比如可能频繁GC,严重就会ANR。

Android 多线程保证操作同步(同步锁的俩种)相关推荐

  1. 多线程常用操作及线程锁

    多线程有很多的方法定义,大部分都在Thread类里面,我们这里强调几个与我们日常开发有关的方法. 复制代码 线程的命名与取得 先来看下Thread类的构造函数 这里由两个可以在创建线程时指定名字的构造 ...

  2. Android多线程之同步锁的使用

    本文主要介绍了Android多线程之同步锁的使用,分享给大家,具体如下: 一.同步机制关键字synchronized 对于Java来说,最常用的同步机制就是synchronized关键字,他是一种基于 ...

  3. 多线程怎么保证数据安全_Python threading实现多线程 提高篇 线程同步,以及各种锁...

    本文主要讲多线程的线程之间的资源共享怎么保持同步. 多线程基础篇见,木头人:Python threading实现多线程 基础篇 Python的多线程,只有用于I/O密集型程序时效率才会有明显的提高,如 ...

  4. Android SQLite多线程读写和线程同步源码分析

    没啥诀窍,只需保证几个线程都是用的一个SQLiteDataBase对象就行了. 如果我们非要在不同线程中用两个或更多的SQLiteDataBase对象呢,当然这些SQLiteDataBase对象所操作 ...

  5. Java多线程-线程的同步与锁

    一.同步问题提出 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. package ...

  6. 多线程编程(3): 使用互斥锁同步线程

    python多线程编程(3): 使用互斥锁同步线程 问题的提出 上一节的例子中,每个线程互相独立,相互之间没有任何关系.现在假设这样一个例子:有一个全局的计数num,每个线程获取这个全局的计数,根据n ...

  7. windows多线程之读写同步(线程锁Mutex + 信号量Semaphore )

    第一次使用博客,把自己学习的心得记录下来,与大家分享,有什么不足请指正,共同学习! 本文记录的是线程同步的一个经典问题,读写问题.这个场景在实际的应用中很常见,多线程中同时对文件进行读写很容易出问题, ...

  8. java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable

    线程 1 线程概述 1.1 什么是线程 v  线程是程序执行的一条路径, 一个进程中可以包含多条线程 v  一个应用程序可以理解成就是一个进程 v  多线程并发执行可以提高程序的效率, 可以同时完成多 ...

  9. Linux多线程编程---线程间同步(互斥锁、条件变量、信号量和读写锁)

    本篇博文转自http://zhangxiaoya.github.io/2015/05/15/multi-thread-of-c-program-language-on-linux/ Linux下提供了 ...

最新文章

  1. 启动tomcat报StandardServer.await: create[8005] 故障解决
  2. java和Js中的类型转换_JavaScript 类型转换
  3. 怎樣制作线段动画_OPPO又开发布会!这两个PPT动画太炫了,荣获网友清一色好评...
  4. 三元组相加获得target
  5. 粒子效果的开始和结束颜色属性
  6. 【Code Review】赛后专访
  7. Oracle 获取当前日期及日期格式
  8. 安装Numpy的简单方法
  9. C++代码审阅--ice104协议从站(1)
  10. 计算机接口接触不良,如何处理电脑耳机插口接触不良
  11. 【板栗糖GIS】如何重复利用arcmap图层的符号样式
  12. [量子计算]量子计算常用高频词汇集(佛系月更)
  13. 国内图像处理相关期刊
  14. 一级建造师考试备考顺序
  15. 【Maya】后台拍屏:以指定摄像机的视口拍屏
  16. 面试!四川我要去哪儿网!
  17. 超级终端之常用AT命令与错误码
  18. 何谓三十而立 四十不惑 五十知天命 六十知耳顺?
  19. 【2017/07】实验记录——SSSP
  20. ns3—— sixth.cc 大概理解

热门文章

  1. 6-RabbitMQ实战
  2. 【微信小程序】全局样式、局部样式、全局配置
  3. faded计算机教程数字顺序,superpads faded数字教程谱子
  4. js封装时间相关函数(倒计时,时间戳,判断是否超时)
  5. java string分割_java 字符串分割的三种方法(总结)
  6. python扫雷 高级算法_扫雷游戏的布雷算法、策略与优化(附Python代码)
  7. 5*6的扫雷游戏的MATLAB程序(随机布雷与显示雷数部分)
  8. 计算机专业与导论战德臣答案,计算机专业导论第07讲-程序与递归-组合-抽象-构造.pdf...
  9. c语言控制继电器开合程序,求STC89c52单片机用倒计时控制继电器开、合的C语言程序,晶振12.000...
  10. 初中计算机活动策划方案,信息技术中考备考方案