证明同步函数使用的this锁

Posted wang66a

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了证明同步函数使用的this锁相关的知识,希望对你有一定的参考价值。

当多个线程操作统一成员变量或者静态变量,在做写的操作时就会发送线程安全问题,做读的操作不会发生线程安全问题。防止线程安全问题可以使用同步代码块(使用的时明锁),同步函数(使用的是this锁),静态同步函数(使用的字节码文件及类.class)

证明同步函数使用的this锁 一个线程使用同步代码,一个线程使用同步函数,如果使用的不是同一把锁则会发生线程安全问题

package www.it.com.thread;

/**
 * @author wangjie
 * @date 2019/11/21 11:42
 * @description 证明同步函数使用的是this锁 一个线程使用代码块,一个使用同步函数
 * @company 石文软件有限公司
 */
public class SynchronizedDemo implements Runnable {
    private Integer count = 100;
    private boolean flag = true;
    //自定义锁
    private Object object = new Object();
    @Override
    public void run() {
        if (flag) {
            while (true) {
                synchronized (object) {
                    if (count > 0) {
                        try {
                            Thread.sleep(40);
                        } catch (Exception e) {

                        }
                        System.out.println(Thread.currentThread().getName() + ",出售 第" + (100 - count + 1) + "张票.");
                        count--;
                    }
                }
            }
        } else {
            while (true) {
                sale();
            }
        }

    }


    public synchronized void sale() {
        if (count > 0) {
            try {
                Thread.sleep(40);
            } catch (Exception e) {

            }
            System.out.println(Thread.currentThread().getName() + ",出售 第" + (100 - count + 1) + "张票.");
            count--;
        }

    }


    public static void main(String[] args) throws InterruptedException {
        SynchronizedDemo synchronizedDemo = new SynchronizedDemo();
        Thread thread1 = new Thread(synchronizedDemo, "线程一");
        Thread thread2 = new Thread(synchronizedDemo, "线程二");
        thread1.start();
        Thread.sleep(100);
        synchronizedDemo.flag = false;
        thread2.start();
    }

}

当同步代码块使用object锁时运行发生线性安全问题

技术图片

将同步代码块变成this锁,因为和同步函数使用的是同一把锁this,所以不会发生线程安全问题

以上是关于证明同步函数使用的this锁的主要内容,如果未能解决你的问题,请参考以下文章

JAVA基础知识(12)-----同步

Thread-线程的同步

读写锁 与 互斥锁

起底多线程同步锁(iOS)

静态方法内的同步块将获取类级别锁或对象级别锁

java线程同步-synchronized