lock与unlock

lock与unlock

使用Java的Lock实现线程同步

传说有一本江湖罕见的武功秘籍,该书珍藏在主持大师手中。一天大师盛情邀请江湖好汉前来观摩该书,但是一次只能有一个人来看。该怎么办呢?用synchronized来实现吗?都用臭了,算了。用下李狗(Doug Lea)写的Lock吧。

实现很简单,首先获得一个锁实例

Lock lock = new ReentrantLock();

接着获得一把锁:

lock.lock();

观摩该书中。。。

lock.unlock();

lock()unlock()之间就是传说中操作系统中的critical section(临界区域),一次只能有一个线程访能够访问到。

废话不多说,看一个简单的例子:

[java] package org.ninnjya.locks;

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;

class 武功秘籍 { private Lock lock;

public 武功秘籍() {
    lock = new ReentrantLock(true); // 公平锁
}

public void 观看武功秘籍(String 读者) {
    System.out.println(读者 + "欲观看该书!");
    lock.lock(); // 获取该锁
    try {
        System.out.println(读者 + "开始阅读...");
        TimeUnit.SECONDS.sleep((long) (Math.random() * 10)); // 每位好汉 是需要不同时间的。耐心等下吧
        System.out.println("想练此功,必先自宫。");
        System.out.println("还是算了。。。 88 ");
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        lock.unlock(); // 切忌看完后记得返还该书,别太自私了
    }
}

}

class 读者 implements Runnable { private 武功秘籍 book; private String 好汉名;

public 读者(武功秘籍 book, String 好汉名) {
    this.book = book;
    this.好汉名 = 好汉名;
}

@Override
public void run() {
    book.观看武功秘籍(好汉名);
}

}

public class Main { public static void main(String args[]) { 武功秘籍 book = new 武功秘籍(); // 只有一本武功秘籍 Runnable[] readers = new Runnable[10]; // 10位武林好汉 for (int i = 0; i < readers.length; i++) { readers[i] = new 读者(book, "读者" + (i + 1)); } ExecutorService 主持大师 = Executors.newCachedThreadPool(); // 将书交给主持大师保管 for (Runnable reader : readers) { 主持大师.execute(reader); // 大师决定将书交给谁看 } 主持大师.shutdown(); // 住持回家吃斋了 } }


下面是控制台输出的一部分:
```plain
读者1欲观看该书!
读者1开始 ...
读者2欲观看该书!
读者3欲观看该书!
读者4欲观看该书!
读者5欲观看该书!
读者6欲观看该书!
读者7欲观看该书!
读者8欲观看该书!
读者9欲观看该书!
读者10欲观看该书!
想练此功,必先自宫。
还是算了。。。 88
读者2开始阅读...
想练此功,必先自宫。
还是算了。。。 88
读者3开始阅读...
想练此功,必先自宫。
还是算了。。。 88
读者4开始阅读...
想练此功,必先自宫。
还是算了。。。 88
读者5开始阅读...
想练此功,必先自宫。
还是算了。。。 88
读者6开始阅读...
想练此功,必先自宫。
还是算了。。。 88

记得调用了lock()方法后,需在finallyfinally确保一定会执行,除非执行了exit()方法)语句里调用unlock()方法。否则会造成死锁等问题。

这里用中文来表示类名和变量名只是为了便于阅读。实际情况下切勿这样写。

Read more

超快速,使用ChatGPT编写回归和分类算法

超快速,使用ChatGPT编写回归和分类算法

本文将使用一些 ChatGPT 提示,这些提示对于数据科学家在工作时非常重要。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 以下是一些示例ChatGPT 提示的列表以及数据科学家的响应。 ChatGPT 提示 为决策树回归算法生成 python 代码。 下面是使用scikit-learn在 Python 中进行决策树回归的示例代码: import numpy as np import matplotlib.pyplot as plt from sklearn.tree import DecisionTreeRegressor # Generate random data rng = np.random.default_rng() x = 5 * rng.random(100) y = np.sin(x) + 0.

By Ne0inhk
力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

力扣每日一题:993.二叉树的堂兄弟节点 深度优先算法

993.二叉树的堂兄弟节点 难度:简单 题目: 在二叉树中,根节点位于深度 0 处,每个深度为 k 的节点的子节点位于深度 k+1 处。 如果二叉树的两个节点深度相同,但 父节点不同 ,则它们是一对堂兄弟节点。 我们给出了具有唯一值的二叉树的根节点 root ,以及树中两个不同节点的值 x 和 y 。 只有与值 x 和 y 对应的节点是堂兄弟节点时,才返回 true 。否则,返回 false。 示例: 示例 1: 输入:root = [1,2,3,4], x = 4, y = 3 输出:false

By Ne0inhk
1239.串联字符串的最大长度 关于字符串的回溯算法!

1239.串联字符串的最大长度 关于字符串的回溯算法!

题目: 给定一个字符串数组 arr,字符串 s 是将 arr 某一子序列字符串连接所得的字符串, 如果 s 中的每一个字符都只出现过一次,那么它就是一个可行解。 请返回所有可行解 s 中最长长度。 提示: 1 <= arr.length <= 16 1 <= arr[i].length <= 26 arr[i] 中只含有小写英文字母 示例: 示例 1: 输入:arr = ["un","iq","ue"] 输出:4 解释:所有可能的串联组合是

By Ne0inhk