使用synchronized关键字封装一个锁

九路 等级 432 0 0

代码如下:

public class Lock {
    private boolean isLocked = false;

    public void lock() {
        synchronized (this) {
            while (isLocked) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    isLocked = false;
                    break;
                }
            }
            isLocked = true;
        }
    }


    public void unLock() {//也可以把synchronized放在方法前
        synchronized (this) {
            isLocked = false;
            notifyAll();
        }
    }
}

用法如下:

public class Counter {
    private int count = 0;

    private Lock mLock = new Lock();

    public void inc(){
        mLock.lock();
        count++;
        mLock.unLock();
    }

    public int getCount(){
        return count;
    }

    public static void main(String[] args) throws InterruptedException {

        Counter counter = new Counter();

        for (int i = 0; i < 500; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {

                    try {
                        Thread.currentThread().sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    counter.inc();
                }
            }).start();
        }


        Thread.currentThread().sleep(1000 * 5);
        System.out.println("count=" + counter.getCount());
    }
}

打印的结果如下: 使用synchronized关键字封装一个锁

收藏
评论区

相关推荐

使用synchronized关键字封装一个锁
代码如下: public class Lock { private boolean isLocked false; public void lock() { synchronized (this) { while (isLocked) { try {
JVM--指令重排序+volatile关键字
volatile 关键字 1、 volatile 翻译为 不稳定的,容易改变的。意思很明确,如果使用volatile 定义一个变量,意思就是可能该变量改变频繁,并且设计到多线程访问问题。 2、不过 现在jdk 的synchronized关键字 性能已经足够出色,也提供了多种Lock 类,因此 volatile关键字能实现的功能 jdk 的同步方法都能够实
3 Java对象的内存布局以及对象的访问定位
先来看看Java对象在内存中的布局 一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储对象自身的运行时数据,包括哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时 间戳等 类型指
android 面试题总结
Java部分 一、多线程   Join()  线程加入,执行此方法的线程优先使用cpu   Yeild()  线程释放资源使所有线程能有相等的机会使用cpu   Sleep() 相当于让线程睡眠,交出CPU,让CPU去执行其他的任务(不会释放锁)。 Wait()方法会让线程进入阻塞状态,并且会释放线程占有的锁,并交出CPU执行权限。
一篇文章弄懂Java多线程基础和Java内存模型
文章目录 一、多线程的生命周期及五种基本状态 二、Java多线程的创建及启动 1.继承Thread类,重写该类的run()方法 2.通过实现Runnable接口创建线程类 3.通过Callable和Future接口创建线程 三、Java内存模型概念 四、内存间的交互操作 五、volatile和synchronized的
synchronized锁升级过程
1.前置知识:    1.1 JAVA对象的内存布局            hotspot虚拟机中,普通对象在堆中的存储可以划分成三部分:对象头(包含了MarkWord和类型指针)、实例例数据和padding。JAVA对象的内存布局MarkWord的长度为4byte/8byte,用于存储对象自身的运行时数据
Zookeeper分布式锁?
客户端A要获取分布式锁的时候首先到locker下创建一个临时顺序节点(node_n),然后立即获取locker下的所有(一级)子节点。此时因为会有多个客户端同一时间争取锁,因此locker下的子节点数量就会大于1。对于顺序节点,特点是节点名称后面自动有一个数字编号,先创建的节点数字编号小于后创建的,因此可以将子节点按照节点名称后缀的数字顺序从小到大排序,这样
Java多线程同步示例(三个售票窗口同时出售20张票)
分析:1.票数要使用同一个静态值;2.为保证不会出现卖出同一个票数,要java多线程同步锁。3.有一个线程卖这张票时,其他线程要等这张票卖完! package person.xsc.practice;public class SaleWindow implements Runnable private int ticket 20; @Ov
notifyAll唤醒线程的范围?
今天看到开源中国上有这样一个问答:假设我有两个对象锁,对象A锁有5个线程在等待,对象B锁有3个线程在等待,对象A锁中的线程执行完,这时调用notifyAll,是唤醒了对象AB两个锁的全部的等待线程还是只唤醒了A锁的5个线程? 1. 方法文档解释通过看该方法文档的解释,可以得出下面结论: notifyAll()中All的含义是所有的线程,而不是所有的锁,只能唤
操作系统学习笔记 原来自旋锁还可以这样实现!
在java中我们知道对线程使用CAS(compare and swap)来实现自旋锁,在没有学习操作系统之前,我以为这是唯一一种方法了。但是今天学到了操作系统中的同步互斥,终于明白了原来CAS、TS、Swap这些都是硬件提供的原子操作罢了!不仅CAS可以实现自旋锁,TS(Test and Set)同样可以! 临界区 临界区进程中访问临界资源的一段需要互斥执行
阿里一线架构师技术图谱!十年开发经验Java架构师
开头我们面试的时候 ,经常会被问这种到问题:Spring中bean的循环依赖怎么解决? Spring中bean的加载过程? spring相关的问题一直是大厂面试常问到的一个问题,也是一直困扰这我们,不知道从哪里下手,今天举例分析大厂的一些spring相关的面试真题。和分享我学习spring相关问题所整理的一些知识点。 01 并发宝典:面试专题面试专题分为四个
推荐程序员面试秘籍!2021年大厂Java岗面试必问
01 JAVA基础 1.1 java知识点 Hashmap 源码级掌握,扩容,红黑树,最小树化容量,hash冲突解决,有些面试官会提出发自灵魂的审问,比如为什么是红黑树,别的树不可以吗;为什么8的时候树化,4不可以吗,等等 concureentHashMap,段锁,如何分段,和hashmap在hash上的区别,性能,等等 HashTable ,同步锁,这块可
阿里巴巴技术专家之作,吊打面试官系列!
美团 一面: 1、ConcurrentHashMap实现原理 2、HashMap实现原理 3、锁的实现原理 4、synchronized和重入所实现原理以及区别 5、一个char[]数组,里面有空格,以&结束。 6、jvm内存模型,都存什么。以及垃圾回收算法,垃圾回收器。 7、内存溢出的场景 8、设计模式,以及自己使用的场景。 9、Sping的AOP实现原
面试百度和美团,竟然问我多线程安全问题,正好撞在我知识点上
解决多线程安全问题无非两个方法synchronized和lock 具体原理以及如何 获取锁AQS算法本篇文章主要讲了lock的原理 就是AQS算法,还有个姊妹篇 讲解synchronized的实现原理 也是阿里经常问的,一定要看后面的文章,先说结论:非公平锁tryAcquire的流程是:检查state字段,若为0,表示锁未被占用,那么尝试占用,若不为0,检查
简简单单复习一哈HashMap
HashMap可被序列化,线程不安全,允许null值和null键,安全的MapCollections.synchronizedMap(): / Returns a synchronized (threadsafe) map backed by the specified map. In order to guarantee s