11.Lock锁

1.创建Lock锁对象的方式:使用实现类ReentrantLock创建Lock对象。

(1)Lock lock=new ReentrantLock();

注:相当于synchronized(this)。

(2)static Lock lock=new ReentrantLock();

注:相当于synchronized(类.class)。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class mysellticket implements Runnable{
    public mysellticket(){
        //测试出来在创建不同对象的时候打印出来的lock对象一样
        System.out.println(lock);
    }
    private static int tickets=10;
    private static Lock lock=new ReentrantLock();
    private int x=5;
    @Override
    public void run() {
        while (x>0) {
            try {
                lock.lock();
                if (x < 0 || x == 0) {//不加这个判断x<=0,结果会多输出两条数据
                    break;
                }
                if (tickets > 0) {
                    try {
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()+":正在销售第"+tickets+"张票");
                    tickets--;
                }
            }finally {
                x--;
                lock.unlock();
            }
        }
    }
    public static void main(String[] args) {
        //同一个my对象,可以锁住。
//        mysellticket my = new mysellticket();
//        Thread t1 = new Thread(my, "窗口1");
//        Thread t2 = new Thread(my, "窗口2");
//        t1.start();
//        t2.start();

        //不同一个my,my1对象,不能锁住。
        mysellticket my = new mysellticket();
        mysellticket my1 = new mysellticket();
        Thread t1 = new Thread(my, "窗口1");
        Thread t2 = new Thread(my1, "窗口2");
        t1.start();
        t2.start();

        //注:要是lock对象加上static修饰,则会锁住类
    }
}

### 互斥(mutex)中 `lock` 方法的使用与实现机制 互斥(mutex)是一种用于多线程编程中的同步机制,旨在确保多个线程在访问共享资源时不会发生竞争条件(race condition)。`lock` 方法是互斥的核心操作之一,用于在进入临界区时定资源,并在退出临界区时解资源。 #### `lock` 方法的基本使用 在 C++ 中,`std::mutex` 提供了基本的互斥功能,其中 `lock()` 方法用于手动定互斥。例如: ```cpp #include <mutex> #include <thread> #include <iostream> std::mutex mtx; void print_block(int n, char c) { mtx.lock(); for (int i = 0; i < n; ++i) { std::cout << c; } std::cout << '\n'; mtx.unlock(); } int main() { std::thread th1(print_block, 50, '*'); std::thread th2(print_block, 50, '$'); th1.join(); th2.join(); } ``` 在上述代码中,`mtx.lock()` 用于在进入临界区时定互斥,`mtx.unlock()` 则用于在退出临界区时释放。这种手动定和解的方式虽然灵活,但也容易导致死或资源泄漏问题。 #### `lock` 方法的实现机制 互斥的实现通常依赖于操作系统提供的底层同步原语,例如在 Windows 上使用的是临界区(critical section)或互斥对象(mutex object),而在 POSIX 系统(如 Linux)上则使用的是 `pthread_mutex_t` 类型。互斥的内部实现涉及原子操作、信号量机制以及线程调度机制。 当一个线程调用 `lock()` 方法时,系统会检查该互斥是否已被其他线程持有。如果未被占用,则当前线程获得并继续执行;如果已被占用,则当前线程会被阻塞,直到被释放。这种机制确保了在同一时刻只有一个线程能够访问共享资源。 #### 使用 `std::lock_guard` 自动管理 为了避免手动调用 `lock()` 和 `unlock()` 可能引发的问题,C++11 引入了 `std::lock_guard`,它是一个轻量级的 RAII(Resource Acquisition Is Initialization)封装类。`std::lock_guard` 在构造时自动调用 `lock()`,在析构时自动调用 `unlock()`,从而确保互斥始终被正确释放。 ```cpp #include <mutex> #include <thread> #include <iostream> std::mutex mtx; void print_block(int n, char c) { std::lock_guard<std::mutex> guard(mtx); for (int i = 0; i < n; ++i) { std::cout << c; } std::cout << '\n'; } int main() { std::thread th1(print_block, 50, '*'); std::thread th2(print_block, 50, '$'); th1.join(); th2.join(); } ``` 在上述代码中,`std::lock_guard` 确保了即使在发生异常的情况下,互斥也能被正确释放,从而避免了死问题[^2]。 #### `boost::unique_lock` 的使用 `boost::unique_lock` 是 Boost 库中提供的一个更灵活的管理工具,它支持延迟定、尝试定以及超时定等特性。与 `std::lock_guard` 不同,`boost::unique_lock` 可以在构造时不立即定互斥,并且可以在后续手动调用 `lock()` 或 `unlock()` 方法。 ```cpp #include <boost/thread.hpp> #include <iostream> boost::mutex mtx; void task() { boost::unique_lock<boost::mutex> lock(mtx); std::cout << "Thread is running.\n"; } int main() { boost::thread th1(task); boost::thread th2(task); th1.join(); th2.join(); } ``` 在上述代码中,`boost::unique_lock` 在构造时自动调用 `lock()`,并在析构时调用 `unlock()`,确保了互斥的正确管理[^1]。 #### 共享与独占的区别 在某些场景下,多个线程可能需要同时读取共享资源,但不允许同时修改资源。此时可以使用 `boost::shared_mutex` 配合 `boost::shared_lock` 实现共享机制。共享允许多个线程同时读取资源,而独占(如 `boost::unique_lock`)则确保只有一个线程可以写入资源。 ```cpp #include <boost/thread.hpp> #include <iostream> boost::shared_mutex smtx; int shared_data = 0; void read_data() { boost::shared_lock<boost::shared_mutex> lock(smtx); std::cout << "Reading data: " << shared_data << "\n"; } void write_data(int value) { boost::unique_lock<boost::shared_mutex> lock(smtx); shared_data = value; std::cout << "Writing data: " << shared_data << "\n"; } int main() { boost::thread th1(read_data); boost::thread th2(write_data, 42); th1.join(); th2.join(); } ``` 在上述代码中,`boost::shared_lock` 用于读取共享资源,而 `boost::unique_lock` 用于写入共享资源。这种机制确保了读写操作的线程安全性。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值