线程同步

  • 1.题目解析
  • 2.线程同步demo
    • 2.1LockSupport Demo
    • 2.2自旋 Demo
    • 2.3阻塞队列 Demo
    • 2.4 synchronized Demo
    • 2.5阻塞队列 Demo
    • 结果

1.题目解析

循环打印出,肯定需要两个进程,如何保障两个进程有序打印呢?这就涉及到的线程同步问题。

  1. 使用同步锁的帮助类:LockSupport
    两个重要方法
 //唤醒指定线程public static void unpark(Thread thread);//阻塞当前进程public static void park();
  1. 使用自旋
    占用cpu时间;

  2. 使用阻塞队列: BlockingDeque

// 将指定的元素插入此deque表示的队列中
put(E e);
// 检索并删除此deque表示的队列头
take();
  1. 使用synchronized,notify,wait
  2. 使用lock,condition;
//使用condition必须先lock();
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();// 唤醒一个等待线程。该线程从等待方法返回前必须获得与Condition相关的锁。condition.signal();//  造成当前线程在接到信号或被中断之前一直处于等待状态condition.wait();

2.线程同步demo

2.1LockSupport Demo


public clsaa Demo {static Thread t1= null;static Thread t2 = null;public static void main(String[] args) throws InterruptedException {List<Integer> numberList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26);List<String> stringList = Lists.newArrayList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");List<String> resultList = Lists.newArrayListWithExpectedSize(numberList.size()+stringList.size());t1 = new Thread(() -> {for (Integer integer : numberList) {resultList.add(String.valueOf(integer));//唤醒指定阻塞线程LockSupport.unpark(t2);//阻塞当前线程LockSupport.park();}});t2 = new Thread(() -> {for (String str : stringList) {//阻塞当前线程LockSupport.park();resultList.add(str);//唤醒指定阻塞线程LockSupport.unpark(t1);}});t1.start();t2.start();//阻塞主线程一会Thread.sleep((long) (10 * 10));System.out.println(resultList);System.out.println(resultList.stream().collect(Collectors.joining()));}
}

2.2自旋 Demo

public clsaa Demo {static Thread t1= null;static Thread t2 = null;enum ThreadToRun {T1, T2}static volatile ThreadToRun threadToRun = ThreadToRun.T1;public static void main(String[] args) throws InterruptedException {List<Integer> numberList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26);List<String> stringList = Lists.newArrayList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");List<String> resultList = Lists.newArrayListWithExpectedSize(numberList.size() + stringList.size());t1 = new Thread(() -> {for (Integer integer : numberList) {//如果不是T1线程,就一直循环while (threadToRun != ThreadToRun.T1) {}resultList.add(String.valueOf(integer));threadToRun = ThreadToRun.T2;}});t2 = new Thread(() -> {for (String str : stringList) {while (threadToRun != ThreadToRun.T2) {}resultList.add(String.valueOf(str));threadToRun = ThreadToRun.T1;}});t1.start();t2.start();//阻塞主线程一会Thread.sleep((long) (10 * 100));System.out.println(resultList);System.out.println(String.join("", resultList));}

2.3阻塞队列 Demo

2.4 synchronized Demo

 public static void main(String[] args) throws InterruptedException {List<Integer> numberList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26);List<String> stringList = Lists.newArrayList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z");List<String> resultList = Lists.newArrayListWithExpectedSize(numberList.size() + stringList.size());Object o = new Object();t1 = new Thread(() -> {synchronized (o) {for (Integer integer : numberList) {resultList.add(String.valueOf(integer));try {//唤醒队列中的一个线程o.notify();//进入等待队列,当前线程让出锁o.wait();} catch (Exception e) {}}o.notify();}});t2 = new Thread(() -> {synchronized (o) {for (String str : stringList) {resultList.add(str);try {//唤醒队列中的一个线程o.notify();//进入等待队列,当前线程让出锁o.wait();} catch (Exception e) {}}//必须,否则程序无法停止o.notify();}});t1.start();t2.start();//阻塞主线程一会Thread.sleep((long) (10 * 100));System.out.println(resultList);System.out.println(String.join("", resultList));}

2.5阻塞队列 Demo

结果

给定两个列表,使用线程同步之打印1A2B3C4D5E6F7G8H9I10J...相关推荐

  1. Linux线程同步之条件变量

    与互斥锁不同,条件变量是用来等待而不是用来上锁的.条件变量用来自动阻塞一个线程,直到某特殊情况发生为止.通常条件变量和互斥锁同时使用. 条件变量使我们可以睡眠等待某种条件出现.条件变量是利用线程间共享 ...

  2. [转]Linux线程同步之条件变量

    与互斥锁不同,条件变量是用来等待而不是用来上锁的.条件变量用来自动阻塞一个线程,直到某特殊情况发生为止.通常条件变量和互斥锁同时使用. 条件变量使我们可以睡眠等待某种条件出现.条件变量是利用线程间共享 ...

  3. 线程同步-生产者消费者问题

    在进行多线程编程时,难免还要碰到两个问题,那就线程间的互斥与同步: 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才 ...

  4. Linux多线程之线程同步

    线程最大的特点就是资源的共享性,所以也就有了一个难点线程同步,实现线程同步的方法最常用的方法是:互斥锁,条件变量和信号量.接下来就让我们来看下这几种同步的方法. 一.互斥锁(Mutex) 获得锁的线程 ...

  5. linux c 线程同步的三种方法

    目录 一.互斥锁(mutex) 二.条件变量(cond) 三.信号量(sem) 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用 ...

  6. Linux 线程同步的三种方法

    程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. 一.互斥锁(mutex) 通过锁机制实现线程间的同 ...

  7. Linux C线程同步的三种方法

    void* thr_fn1() {printf ("111111"); }int main() {int err;pthread_t tid;void *tret;err = pt ...

  8. python列表两两组合_关于python:两个列表之间的组合?

    已经有一段时间了,我很难用我正在尝试的算法来概括我的想法.基本上,我有两个列表,想要得到这两个列表的所有组合. 我可能解释不正确,所以这里举个例子. name = 'a', 'b' number = ...

  9. linux线程同步的方法

    #Linux 线程同步的三种方法 线程的最大特点是资源的共享性,但资源共享中的同步问题是多线程编程的难点.linux下提供了多种方式来处理线程同步,最常用的是互斥锁.条件变量和信号量. ##一.互斥锁 ...

最新文章

  1. 神经网络通用近似定理
  2. git clone 几种可选参数的使用与区别
  3. JQuery 自动触发 a 标签的 click事件
  4. MVC简捷调用EasyUI的datagrid
  5. Maven开发笔记(四)—— Maven中plugins和pluginManagement
  6. Python Twisted 介绍
  7. java mvc页面传值方式_详解SpringMVC的ModelAndView传值方法
  8. 第0课第2节_刚接触开发板之烧写裸板程序
  9. 静态方法和类方法之间的区别
  10. 如何应对当下的 996?
  11. DataTables之TableTools插件
  12. c#精彩编程200例百度云_每天宅家创客5分钟|智龙6号星球车:01唤醒星球车——温州中小学趣味信息技术云课程...
  13. cloudcompare断面提取
  14. html网页图片自动切换代码,html5图片列表切换浏览模式代码
  15. 计算两个时间相差多少小时、分钟、秒
  16. 小微企业都在用的一体化管理解决方案
  17. 深富策略:罕见巨额成交量背后蕴含深意
  18. ISCSLP 2022 | AccentSpeech—从众包数据中学习口音来构建目标说话人的口音语音合成系统
  19. python改变列的数据类型_更改Pandas中列的数据类型
  20. Java基础笔记:Day_10 接口、匿名内部类

热门文章

  1. 分布式-分布式缓存笔记
  2. 示波器显示读取串口数据
  3. 慕课网 (IT技能学习平台)
  4. 使用深度神经网络完成对鸢尾花的分类
  5. 问下大家,chorme里用开发者工具看headers,点network标签然后刷新网页并没有headers选项,怎么破?...
  6. OpenCV实战(10)——积分图像详解
  7. rrpr机器臂的matalb Robotic Toolbox工具箱的使用
  8. Python 视频添加音频(附代码) | Python工具
  9. mac 上一些很棒的软件
  10. shell 输入一串数字判断是否是手机号码