java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java互斥锁

Java多线程中的互斥锁解析

作者:伊颦伊笑

这篇文章主要介绍了Java多线程中的互斥锁解析,Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性,每个对象都对应于一个可称为互斥锁的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象,需要的朋友可以参考下

基本介绍

  1. Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
  2. 每个对象都对应于一个可称为 “ 互斥锁 ” 的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
  3. 关键字 synchronized 来与对象的互斥锁联系。当某个对象用 synchronized 修饰时,表明该对象在任一时刻只能由一个线程访问
  4. 同步的局限性:导致程序的执行效率要降低
  5. 同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)
  6. 同步方法(静态的)的锁为当前类本身。

把 synchronized 写在代码块上

package thread_;
/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 16:37 2021/9/27
 */
public class Thread11 {
    public static void main(String[] args) {
        SellThread04 sellThread04 = new SellThread04();
        new Thread(sellThread04).start();
        new Thread(sellThread04).start();
        new Thread(sellThread04).start();
    }
}
class SellThread04 implements Runnable{
    private int ticketsNum = 100;
    private boolean flag = true;
    @Override
    public void run() {
        while (flag) {
            sell();
        }
    }
    /*
        1. public synchronized void sell(){} 就是一个同步方法
        2. 这时“锁”在 this 对象上
        3. 也可以在代码块上写 synchronized,同步代码块,互斥锁还是在 this 对象上
           如下:
     */
    public /* synchronized */ void sell(){
        synchronized (this) {
            if(ticketsNum <= 0){
                System.out.println("售票结束...");
                flag = false;
                return;
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("窗口 " + Thread.currentThread().getName() + " 售票一张, 剩余票数 " + (--ticketsNum));
        }
    }
}

测试操作同一个对象、静态方法的锁的添加

package thread_;
/**
 * @Author: Gin
 * @Description:
 * @Modified By: Gin
 * @Date: Created in 16:37 2021/9/27
 */
public class Thread11 {
    public static void main(String[] args) {
        SellThread04 sellThread04 = new SellThread04();
        new Thread(sellThread04).start();
        new Thread(sellThread04).start();
        new Thread(sellThread04).start();
    }
}
class SellThread04 implements Runnable{
    private int ticketsNum = 100;
    private boolean flag = true;
    // 同步方法(非静态的)的锁可以是this,也可以是其他对象(要求是同一个对象)
    // new 一个 Object 对象,测试操作同一个对象
    Object object = new Object();
    // 同步方法(静态的)的锁为当前类本身。
    public synchronized static void m1(){
        System.out.println("m1");
    }
    // 在静态方法中实现一个同步代码块
    public static void m2(){
        synchronized (SellThread04.class) {
            System.out.println("m2");
        }
    }
    @Override
    public void run() {
        while (flag) {
            sell();
        }
    }
    /*
        1. public synchronized void sell(){} 就是一个同步方法
        2. 这时“锁”在 this 对象上
        3. 也可以在代码块上写 synchronized,同步代码块,互斥锁还是在 this 对象上
           如下:
     */
    public /* synchronized */ void sell(){
        synchronized ( /*this*/ object ) { // 测试操作同一个对象
            if(ticketsNum <= 0){
                System.out.println("售票结束...");
                flag = false;
                return;
            }
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("窗口 " + Thread.currentThread().getName() + " 售票一张, 剩余票数 " + (--ticketsNum));
        }
    }
}

细节

同步方法如果没有使用 static 修饰:默认锁对象为 this如果方法使用 static 修饰,默认锁对象:当前类.class

到此这篇关于Java多线程中的互斥锁解析的文章就介绍到这了,更多相关Java互斥锁内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文