多线程协作方法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("\r\n");
  •              }

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

线程安全问题:

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

 

posted @ 2017-02-18 19:42  御姐  阅读(219)  评论(0编辑  收藏  举报