多线程中锁的种类。

1. 可重入锁

  ReentrantLock 和 synchronized 都是可重入锁。

1 class Main{
2     public synchronized void method1() {
3         method2();
4     }
5
6     public synchronized void method2() {
7
8     }
9 }

  在method1中会调用另外一个synchronized方法method2,此时线程不必重新去申请锁,而是可以直接执行方法method2。如果不具有可重入性,则会造成死锁。

2. 可中断锁

  Lock 是可中断锁,而synchronized 不是可中断锁。

  如果某一线程A正在执行锁中的代码,另一线程B正在等待获取该锁,可能由于等待时间过长,线程B不想等待了,想先处理其他事情,我们可以让它中断自己或者在别的线程中中断它,这种就是可中断锁。

3. 公平锁

  synchronized 是非公平锁,它无法保证线程获取锁的顺序。ReentrantLock 与 ReentrantReadWriteLock,它默认情况下是非公平锁,但是可以设置为公平锁。

  公平锁即尽量以请求锁的顺序来获取锁。比如同时有多个线程在等待一个锁,当这个锁被释放时,等待时间最久(最先请求)的的线程会获得该锁,这种就是公平锁。

1 public ReentrantLock() {
2      sync = new NonfairSync();
3 }
4
5 public ReentrantLock(boolean fair) {
6      sync = fair ? new FairSync() : new NonfairSync();
7 }

  如果参数为true表示为公平锁,为fasle为非公平锁。默认情况下,如果使用无参构造器,则是非公平锁。

4. 读写锁

  读写锁使得多个读操作不会发生冲突。

  如果有一个线程已经占用了读锁,则此时其他线程如果要申请写锁,则申请写锁的线程会一直等待释放读锁。如果有一个线程已经占用了写锁,则此时其他线程如果申请写锁或者读锁,则申请的线程会一直等待释放写锁。

 1 public void get(Thread thread) {
 2         ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
 3         rwlock.readLock().lock();
 4         try {
 5             long start = System.currentTimeMillis();
 6
 7             while(System.currentTimeMillis() - start <= 1) {
 8                 System.out.println(thread.getName()+"正在进行读操作");
 9             }
10             System.out.println(thread.getName()+"读操作完毕");
11         } finally {
12             rwlock.readLock().unlock();
13         }
14 }

原文地址:https://www.cnblogs.com/yumingxing/p/9581586.html

时间: 2024-11-09 21:58:07

多线程中锁的种类。的相关文章

Object-C 多线程中锁的使用-NSLock

在多线程的编程环境中,锁的使用必不可少! 于是,今天来总结一下为共享资源加锁的操作方法. 一.使用synchronized方式 //线程1 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ @synchronized (_myLockObj){ [obj1 method1]; sleep(30); } @synchronized (obj1){ } }); //线程2 dispatch

python多线程中锁的概念

python的锁可以独立提取出来 mutex = threading.Lock() #锁的使用 #创建锁 mutex = threading.Lock() #锁定 mutex.acquire([timeout]) #释放 mutex.release() 概念 好几个人问我给资源加锁是怎么回事,其实并不是给资源加锁, 而是用锁去锁定资源,你可以定义多个锁, 像下面的代码, 当你需要独占某一资源时,任何一个锁都可以锁这个资源 就好比你用不同的锁都可以把相同的一个门锁住是一个道理 import thr

多线程中锁的概念python

好几个人问我给资源加锁是怎么回事,其实并不是给资源加锁, 而是用锁去锁定资源,你可以定义多个锁, 像下面的代码, 当你需要独占某一资源时,任何一个锁都可以锁这个资源 就好比你用不同的锁都可以把相同的一个门锁住是一个道理 #coding: utf-8 import threading import time counter = 0 counter_lock = threading.Lock() #只是定义一个锁,并不是给资源加锁,你可以定义多个锁,像下两行代码,当你需要占用这个资源时,任何一个锁都

多线程中锁的使用

本文转自:http://www.2cto.com/kf/201401/274446.html 主要介绍下C#的两种锁:互斥锁(lock)和读写锁(ReadWriteLock) 互斥锁(lock) lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁.当任何一个线程获取到锁后,其他线程如果需要使用该临界区内代码,则必须等待前一个线程使用完毕后释放锁. 代码示例: Object thisLock = new Object(); lock (thisLock) {

锁的种类

锁的种类 Java中锁的种类大致分为偏向锁,自旋锁,轻量级锁,重量级锁. 锁的使用方式为:先提供偏向锁,如果不满足的时候,升级为轻量级锁,再不满足,升级为重量级锁.自旋锁是一个过渡的锁状态,不是一种实际的锁类型. 锁只能升级,不能降级. 偏向锁 是一种编译解释锁.如果代码中不可能出现多线程并发争抢同一个锁的时候,JVM编译代码,解释执行的时候,会自动的放弃同步信息.消除synchronized的同步代码结果.使用锁标记的形式记录锁状态.在Monitor中有变量ACC_SYNCHRONIZED.当

c#语言-多线程中的锁系统

介绍 平常在多线程开发中,总避免不了线程同步.这次就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 二: mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) { Console.Wri

多线程编程-- part5 锁的种类以及辨析

java中的锁,可以分为同步锁和JUC包中的锁. 同步锁 通过synchronized关键字进行同步,实现对竞争资源的互斥访问的锁,. 原理:对于每一个对象,有且只有一个同步锁,在同一时间点,所有的线程中有且只有一个能获取该同步锁,获取到同步锁的就可以被CPU进行调度,其他线程必须等待,直到获取到同步锁之后才能继续运行,这就是多线程通过同步锁进行同步的原理. JUC包中的锁:java.util.concurrent 功能更强大,使用当然更复杂. JUC包中锁,包括:lock接口,readWrit

c#语言-多线程中的锁系统(一)

介绍 平常在多线程开发中,总避免不了线程同步.本篇就对net多线程中的锁系统做个简单描述. 目录 一:lock.Monitor 1:基础. 2: 作用域. 3:字符串锁. 4:monitor使用 二:mutex 三:Semaphore 四:总结 一:lock.Monitor 1:基础 Lock是Monitor语法糖简化写法.Lock在IL会生成Monitor. //======Example 1===== string obj = "helloworld"; lock (obj) {

Java多线程中的竞争条件、锁以及同步的概念

竞争条件 1.竞争条件: 在java多线程中,当两个或以上的线程对同一个数据进行操作的时候,可能会产生"竞争条件"的现象.这种现象产生的根本原因是因为多个线程在对同一个数据进行操作,此时对该数据的操作是非"原子化"的,可能前一个线程对数据的操作还没有结束,后一个线程又开始对同样的数据开始进行操作,这就可能会造成数据结果的变化未知. package com.huojg.test; public class TestThread { public static void