同步锁(lock)

有两种机制防止代码块受并发访问的干扰:

1、一个是使用synchronized关键字。

2、使用ReentrantLock类。(通过显示定义同步锁对象来实现同步。)

同步锁(lock)方法是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前先获得Lock对象。

Lock、ReadWriteLock(读写锁)是java 5 提供的两个根接口。别为Lock接口提供了ReentrantLock(可重入锁)实现类;为ReadWriteLock接口提供了ReentrantReadWriteLock实现类。

在实现线程安全的控制中,比较常用的是ReentrantLock(可重入锁)。使用该Lock对象可以显示地加锁、释放锁。

 1 import java.util.*;
 2 import java.util.concurrent.locks.ReentrantLock;
 3 public class Other extends Thread{
 4     private Account account;
 5     private double drawAmount;
 6     //private String name;
 7     public Other(Account account,double drawAmount,String name){
 8         super(name);//必须是第一语句
 9         this.account=account;
10         this.drawAmount=drawAmount;
11         start();
12     }
13     public void run(){
14         for(int i=0;i<15;i++){
15         account.draw(drawAmount);
16         }
17     }
18     public static void main(String[] args){
19         Account a=new Account("刘腾",10000);
20         Other o=new Other(a,1000,"A");
21         Thread t=new Thread(new RunnableClass(a));
22         t.setName("B");
23         t.start();
24     }
25 }
26 class Account{
27     //定义锁对象
28     private final ReentrantLock lock=new ReentrantLock();
29     private String name;
30     private double money;
31     public Account(){}
32     public Account(String name,double money){
33         this.name=name;
34         this.money=money;
35     }
36     public double getMoney(){
37         lock.lock();
38         try{
39         return money;}
40         finally{
41         lock.unlock();
42         }
43     }
44     public void draw(double drawAmount){
45         lock.lock();
46         try{
47             if(money>=drawAmount){
48                 System.out.println(name +"取钱成功!吐出钞票:"+drawAmount);
49                 try{
50                         Thread.sleep(1000);
51                 }catch(Exception e){
52                     System.out.println(e);
53                 }
54                 money-=drawAmount;
55                 System.out.println("余额为:"+getMoney());
56             }else{
57                 System.out.println("取钱失败!余额不足!");
58             }
59         }finally{
60             lock.unlock();
61         }
62     }
63 }
64 class RunnableClass implements Runnable{
65     private Account account;
66     //private double drawAmount;
67     public RunnableClass(Account account){
68         this.account=account;
69         //this.drawAmount=drawAmount;
70     }
71     public void run (){
72         for(int k=0;k<10;k++){
73         try{
74         Thread.sleep(1000);
75         System.out.println(Thread.currentThread().getName()+"读取钱数为:"+account.getMoney());}
76         catch(Exception e){}
77         }
78     }
79 }

需要导入import java.util.concurrent.locks.ReentrantLock;

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

同步锁(lock)的相关文章

Java同步锁——lock与synchronized 的区别【转】

一.Lock和synchronized有以下几点不同: 1)Lock是一个接口,而synchronized是Java中的关键字,synchronized是内置的语言实现,synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将 unLock()放到finally{} 中: 2)synchronized在发生异常时,会

C# 同步锁 lock Monitor

Lock关键字 C#提供lock关键字实现临界区,MSDN里给出的用法: Object thisLock = new Object();lock (thisLock){   // Critical code section} 还有一种是比lock更“高级”的Monitor: private static object obj = new object(); public static void SomeMethod() { bool lockTaken=false; //假定没有获取锁 try

MongoDB Secondary 延时高(同步锁)案例分析

遇到问题:晚10点,DBA在数据库建立了某collection的索引.在之后的几分钟,恰巧有同事访问某应用,验证该应用的账号需从数据库某表查询账号密码.导致了无法查询,同事无法登录上应用.问题便反馈到了运维部. 背景介绍: Mongodb版本 3.0.2 建索引和collection和账号查询collection所在同一台服务器,不同库名上. 因使用的是mongodb3.0.2,之前了解到3.0是行级锁,于是dba在建该表索引时,并未加参数background:true. 查原因: 同事无法登录

并发编程(五)__Lock 同步锁

用于解决多线程安全问题的方式: synchronized:隐式锁 1. 同步代码块  2. 同步方法 jdk 1.5 后: 3. 同步锁 Lock 注意:是一个显示锁,需要通过 lock() 方法上锁,必须通过 unlock() 方法进行释放锁 import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /* * 一.用于解决多线程安全问题的方式: * * synchronize

同步锁2

1 import threading 2 import time 3 4 num = 100 5 def add(): 6 global num 7 s = num 8 time.sleep(0.02) 9 num = s - 1 10 11 l = list() 12 for i in range(100): 13 t = threading.Thread(target=add) 14 l.append(t) 15 t.start() 16 for i in l: 17 i.join() 18

java中多线程模拟(多生产,多消费,Lock实现同步锁,替代synchronized同步代码块)

import java.util.concurrent.locks.*; class DuckMsg{ int size;//烤鸭的大小 String id;//烤鸭的厂家和标号 DuckMsg(){ } DuckMsg(int size, String id){ this.size=size; this.id=id; } public String toString(){ return id + " 大小为:" + size; } } class Duck{ private int

python笔记10-多线程之线程同步(锁lock)

前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸.为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸熟了再开吃,那么python如何模拟这种场景呢? 未锁定 1.如果多个线程同时操作某个数据,会出现不可预料的结果.比如以下场景:当小伙伴a在往火锅里面添加鱼丸的时候,小伙伴b在同时吃掉鱼丸,这很有可能导致刚下锅的鱼丸被夹出来了(没有熟),或者还没下锅,就去夹鱼丸(夹不到). # coding=utf-

同步锁之lock

一. synchronized的缺陷 当一个代码块被synchronized修饰时,同时该代码块被一个线程执行,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况: 1)获取锁的线程执行完成代码块,自动释放锁资源 2)代码块中执行异常,由jvm释放锁资源 如果在执行代码块时候,一个线程在代码块执行过程中Thread.sleep() 睡眠  线程被阻塞了,其他线程只能等待当前线程执行完成后才能执行.及其浪费效率. 另外当多个线程在执行写与写操作时,会发生线程冲突

JUC--Callable 以及Lock同步锁

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