• 多线程协作方法sleep、yield、wait、join和同步和安全等问题


    sleep(休眠)

    • 当t线程调用Thread.sleep()时,会让线程t休眠指定时间
    • Thread.sleep() 和 Thread.currentThread().sleep() 效果一样
    • sleep方法不会释放同步锁
    • sleep不会影响到其他线程
    yield(让步)礼让线程
    • 在t线程中调用Thread.yield()时会让t线程放弃一次cpu调度(通常是当前这次调度)
    • yield让当前线程让步给其他线程执行
    wait(锁住等待)
    • 当t线程调用obj.wait()时,t线程会进入waiting状态,并放弃obj对象锁,直到其他线程调用obj.notify()/notifyAll()方法唤醒线程t
    • wait方法会释放同步锁
    • 线程只能在一个同步块中调用wait方法
    • wait方法让两个线程交替执行
    join(加入):jion()或者join(int)时间,可以等待指定的毫秒之后继续
    • 在main线程中调用线程t.join()时,main线程会等待t线程完全执行完成才会继续执行
    • join让两个线程串行执行

    守护线程 setsetDaemon(true或者false)

    • 设置一个线程为守护线程, 该线程不会单独执行, 当其他非守护线程都执行结束后, 自动退出

    设置线程优先级

    • setPriority()设置线程的优先级

    同步代码块

    • 1.什么情况下需要同步
    • 当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步.
    • 如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码.
    •  2.同步代码块
    •   使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块
    •  多个同步代码块如果使用相同的锁对象, 那么他们就是同步的
    • 注意:锁对象可以是任意对象,但是被锁的代码需要保证是同一把锁,不能用匿名对象
    • 例子:

    同步方法

    •   使用synchronized关键字修饰一个方法, 该方法中所有的代码都是同步的
    • /*
    •               * 非静态同步函数的锁是:this
    •               * 静态的同步函数的锁是:字节码对象
    •               */
    •              public static synchronized void print2() {  
    •                   System.out.print("传");
    •                   System.out.print("智");
    •                   System.out.print("播");
    •                   System.out.print("客");
    •                   System.out.print(" ");
    •              }

    死锁:多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁,所以尽量不要嵌套使用

    线程安全问题:

    • 多线程并发操作同一数据时, 就有可能出现线程安全问题
    • * 使用同步技术可以解决这种问题, 把操作数据的代码进行同步, 不要多个线程一起操作

     

  • 相关阅读:
    Mysql的ONLY_FULL_GROUP_BY
    Redis报错“ OOM command not allowed when used memory > 'maxmemory' ”
    redis发布订阅客户端报错
    使用IDEA远程调试SpringBoot程序
    kafk学习笔记(一)
    Ubuntu中卸载node和npm并重装
    一些常用的类型转换
    一台电脑配置多个GigHub账号
    百度网盘文件直接下载方法(跳过每次需要启动百度网盘下载的方式)
    如何激活IDEA工具,亲测有效
  • 原文地址:https://www.cnblogs.com/lxchma/p/6413928.html
Copyright © 2020-2023  润新知