java基础——lock同步锁

package lock;

/*
方式三:
    Lock锁
synchronized和lock的不同
1.sychronized在执行完相应代码块以后属于自动释放同步监视器,lock需要手动启动同步
建议优先使用lock->同步方法块->同步方法(在方法体之外)

实现Runnable对象被三个线程调用,然后这个对象的run方法里贡献资源操作器被lock上锁了

@author zsben
@create 2020-01-03 23:55
*/

import java.util.concurrent.locks.ReentrantLock;

class Window implements Runnable{

    private int ticket = 100;

    //1.实例化lock
    private ReentrantLock lock = new ReentrantLock(true);//fair=true:公平锁,线程先来后到

    @Override
    public void run() {
        while(true){
            try{
                //2.调用lock方法
                lock.lock();

                if(ticket>0){

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println(Thread.currentThread().getName()+": "+ticket);
                    ticket--;
                }else break;
            }
            finally {
                //3.调用解锁方法
                lock.unlock();
            }
        }
    }
}

public class LockTest {

    public static void main(String[] args) {
        Window w = new Window();

        Thread t1 = new Thread(w);
        Thread t2 = new Thread(w);
        Thread t3 = new Thread(w);

        t1.start();
        t2.start();
        t3.start();

    }
}

原文地址:https://www.cnblogs.com/zsben991126/p/12148326.html

时间: 2024-10-08 10:34:26

java基础——lock同步锁的相关文章

JUC--Callable 以及Lock同步锁

/** * 一.创建执行线程的方式三:实现Callable接口.相较于实现Runnable接口方式,方法可以有返回值,并且可以抛出异常 * 二.callable 需要FutureTask实现类的支持.用于接受运算结果.FutureTask是Future接口的实现类. * * 线程执行完之后才会执行result.get 可以当做闭锁看 */ public class TestCallable { public static void main(String[] args) { ThreadDemo

java基础——线程同步块

实现Runnable的线程同步块 package synchronization.block; /* @author zsben @create 2020-01-03 13:48 创建三个窗口卖票,使用Runnable接口方式 1.问题:卖票过程中出现了重票,错票-->出现了线程安全问题 2.解决方案:当一个线程在操作ticket时,其他线程不能参与进来(即使该线程被阻塞) 直到该线程操作完ticket,其他线程才可以参与进来, 3.java中通过同步机制进行解决 方式一:同步代码块 synch

JAVA并发,同步锁性能测试

测试主要从运行时间差来体现,数据量越大,时间差越明显,例子如下: 1 package com.xt.thinks21_2; 2 3 /** 4 * 同步锁性能测试 5 * 6 * @author Administrator 7 * 8 */ 9 public class SynchronizedTimeTest { 10 public volatile int inc = 0; 11 12 public void increase() { 13 inc++; 14 } 15 16 public

《GCD 实现同步锁》-07-多线程

@MicroCai 2015-03-03 23:18 字数 6539 阅读 202 Effective Objective-C Notes:GCD 实现同步锁 Archives iOS <Effective Objective-C Notes>系列博文整理自<Effective Objective-C 2.0> 如果您觉得我的博客对您有帮助,请通过关注我的新浪微博  MicroCai 支持我,谢谢! 本文名为<GCD 实现同步锁>,内容不止于锁.文章试图通过 GCD 同

Java性能之synchronized锁的优化

synchronized / Lock 1.JDK 1.5之前,Java通过synchronized关键字来实现锁功能 synchronized是JVM实现的内置锁,锁的获取和释放都是由JVM隐式实现的 2.JDK 1.5,并发包中新增了Lock接口来实现锁功能 提供了与synchronized类似的同步功能,但需要显式获取和释放锁 3. Lock同步锁是基于Java实现的,而synchronized是基于底层操作系统的Mutex Lock实现的 每次获取和释放锁都会带来用户态和内核态的切换,从

【Java基础总结】多线程

1. java中实现多线程的两种方式 1 //第一种:继承Thread类,重写run()方法 2 class ThreadTest1 extends Thread{ 3 public void run(){ 4 String threadName = Thread.currentThread().getName(); 5 for(int i=0;i<10;i++){ 6 System.out.println("ThreadTest1 "+threadName+" run

26 python 初学(线程、同步锁、死锁和递归锁)

参考博客: www.cnblogs.com/yuanchenqi/articles/5733873.html 并发:一段时间内做一些事情 并行:同时做多件事情 线程是操作系统能够进行运算调度的基本单位,一个线程就是一个指令集 IO 密集型任务或函数  计算密集型任务函数 t1 = threading.Thread( target=foo, args=( , )) t1.start() # _author: lily # _date: 2019/1/29 import threading impo

线程同步锁、死锁、递归锁、信号量、GIL

目录 线程同步锁.死锁.递归锁.信号量.GIL 一.同步锁 二.死锁 三.递归锁(Rlock) 四.信号量(Semphare) 五.GIL(全局解释器锁) io密集型 计算密集型 线程同步锁.死锁.递归锁.信号量.GIL 一.同步锁 所有线程同一时间读写同一个数据,有的线程已经对数据进行修改了,造成有的线程拿到的数据时旧的数据,而不是修改后的数据,造成结果不正确,于是引入了同步锁解决问题, 同步锁的原理是同一时间只能有一个线程读写数据. 锁通常被用来实现对共享资源的同步访问.从threading

JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题

JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.net/m366917 我们来继续学习多线程 Lock锁的使用 虽然我们可以理解同步代码块和同步方法的锁对象问题,但是我们并没有直接看到在哪里加上了锁,在哪里释放了锁,为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁对象Lock Lock void lock():获取锁 v