线程同步的三种方式

线程同步的三种方式

  1. 同步代码块。

  2. 同步方法。

  3. 锁机制。 

同步代码块: synchronized 关键字可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。

  synchronized(同步锁){

      需要同步操作的代码

  }

  同步锁:
  对象的同步锁只是一个概念,可以想象为在对象上标记了一个锁.

    1. 锁对象 可以是任意类型。

    2. 多个线程对象 要使用同一把锁。

/**
* 同步代码块
*/
public class Ticket implements Runnable {
private int ticket = 100;

Object lock=new Object();

@Override
public void run() {
while(true){
synchronized(lock){
if (ticket>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 正在卖:"+ticket--+"张票!");
}
}
}
}

}

同步方法:使用synchronized修饰的方法,就叫做同步方法,保证A线程执行该方法的时候,其他线程只能在方法外 等着。 

   public synchronized void method(){

        可能会产生线程安全问题的代码

     } 

/**
* 同步方法
*/
public class Ticket01 implements Runnable {
private int ticket = 100;

@Override
public void run() {
while(true){
sellTicket();
}
}
public synchronized void sellTicket(){
if (ticket>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 正在卖:"+ticket--+"张票!");
}
}
}

对于非static方法,同步锁就是this。

对于static方法,我们使用当前方法所在类的字节码对象(类名.class)。

Lock锁机制:java.util.concurrent.locks.Lock 机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作, 同步代码块/同步方法具有的功能Lock都有,

   除此之外更强大,更体现面向对象。 Lock锁也称同步锁,加锁与释放锁方法化了,如下:

  • public void lock() :加同步锁。
  • public void unlock() :释放同步锁  
/**
* Lock锁机制
*/
public class Ticket02 implements Runnable {
private int ticket = 100;
Lock lock = new ReentrantLock();
@Override
public void run() {
while(true){
lock.lock();
if (ticket>0){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+" 正在卖:"+ticket--+"张票!");
}
lock.unlock();
}
}
}


 

posted @ 2020-07-08 22:43  yl丶  阅读(794)  评论(0编辑  收藏  举报