`

线程本地锁

 
阅读更多
static关键字的四种用法
https://www.cnblogs.com/dotgua/p/6354151.html?utm_source=itdadao&utm_medium=referral

synchronized与static synchronized 的区别
https://www.cnblogs.com/shipengzhi/articles/2223100.html

synchronized(this)、synchronized(class)与synchronized(Object)的区别:
http://blog.csdn.net/luckey_zh/article/details/53815694

Java中的ReentrantLock和synchronized两种锁定机制的对比:
http://blog.csdn.net/fw0124/article/details/6672522
我们什么时候才应该使用 ReentrantLock 呢?答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。ReentrantLock 还具有可伸缩性的好处。

Lock锁:简单粗暴
private Lock lock = new ReentrantLock();

加锁 lock.lock(); 十个线程拿锁,其中一个拿锁后,等待一个解锁,解锁后其他九个线程抢锁。
解锁 lock.unlock(); 解操作一定放在finally,当线程异常时,业务代码都会进行解锁操作。
package com.hailong.yu.dongnaoxuexi;

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

public class LockTest implements Runnable {

	private static int num = 0;
	// 倒计时器(发令枪),用于制造线程并发执行
	// 线程之间协同机制一种方式: lock、wait()和notify()、notifyAll()
	// 线程信号量机制: countDownLatch
	// 线程并发块:sychroznied
	// 事件(秒杀):https://www.cnblogs.com/zsboy/p/3980894.html
	private static CountDownLatch countDownLatch = new CountDownLatch(10);
	
	// 静态锁,让线程用同一把锁
	private static Lock lock = new ReentrantLock();
	
	private String content;

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	private LockTest(String content) {
		this.content = content;
	}
	
//	private Lock lock = new ReentrantLock();
	
	public void run() {
		try {
			// 线程运行等待(阻塞),等待发令枪为0;
			countDownLatch.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		lock.lock();
		try {
//			counter.getAndIncrement();
			num++;
			// 同时并发访问打印方法
			System.out.println("线程:" + Thread.currentThread().getName()+" 打印文档: "+ num +content);
		} catch(Exception e) {
			e.getMessage();
		} finally {
			lock.unlock();
		}

		// 什么是线程安全问题 counter共享资源
		// 同一段代码在高并发情况下,每次运行结果都不一样。
		// 用锁的方式让其合理
	}

	public static void main(String[] args) {
		
		for(int i=0;i<10;i++) {
			// TODO Auto-generated method stub
			Thread thread = new Thread(new LockTest("天王盖地虎"));
			thread.setName("线程" + i);
			thread.start();
			// 排队处理线程,加了之后是同时处理线程
			countDownLatch.countDown();
		}
	}
}


package java.util.concurrent.locks;
import java.util.concurrent.TimeUnit;

/**
 * 
 */
public interface Lock {

    /**
     * 阻塞锁(synchonied是阻塞的)
     */
    void lock();

    /**
	 * 中断机制(可中断锁)
      * 可中断锁等候
     */
    void lockInterruptibly() throws InterruptedException;

    /**
     * 非阻塞式锁
     */
    boolean tryLock();

    /**
     * 
     */
    boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

    /**
     * 解锁
     */
    void unlock();

    /**
     * 设置条件加锁或解锁
     * 多个条件变量
     */
    Condition newCondition();
}
分享到:
评论

相关推荐

    线程管理锁

    2. **临界区(Critical Section)**:临界区是线程本地的同步对象,只能被同一进程内的线程使用。当一个线程进入临界区后,其他试图进入的线程将被挂起,直到该线程退出。`CCriticalSection`类提供了对临界区的封装...

    线程并发时 本地变量和Lock锁的效率比较

    在Java中,可以使用`ThreadLocal`类来创建线程本地变量。使用本地变量可以简化代码,因为不需要进行同步操作,但需要注意的是,如果变量不再使用,记得及时清理,防止内存泄漏。 **Lock锁** Lock锁是一种显式同步...

    27道顶尖的Java多线程、锁、内存模型面试题!.zip

    Java多线程、锁机制和内存模型是Java编程中至关重要的一部分,尤其在面试时,这些都是考察候选人技术深度和广度的常见话题。以下是对这些关键概念的详细解释: 1. **Java多线程**:Java提供了多种方式创建线程,如...

    C++类中创建多线程实现本地和远程打印

    9. **资源管理**:线程、锁和网络连接等资源需要在使用后及时释放,防止资源泄漏。C++智能指针(如`std::unique_ptr`或`std::shared_ptr`)和RAII(Resource Acquisition Is Initialization)原则可以帮助自动管理...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    在Java中,线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。Java提供两种创建线程的方式:继承Thread类或实现Runnable接口。创建线程后,可以调用start()方法启动...

    多线程编程指南

    - **2.3.2 配置线程本地存储**:为线程分配专用的存储空间。 - **2.3.3 设置线程的脱离状态**:确定线程是否会在创建它的线程结束时自动销毁。 - **2.3.4 设置线程的优先级**:调整线程的执行优先级,影响其调度顺序...

    多线程,数据库优化,锁.docx

    以一个将外部系统查询出的数据批量导入本地数据库的应用为例,假设需要导入的数据量为几万条记录。如果采用单线程的方式逐一处理这些记录,整个过程可能会非常耗时,例如半小时甚至更久。通过引入多线程技术,可以...

    C#_细说多线程(上下)

    线程拥有自己的CPU寄存器、调用栈和线程本地存储(TLS)。这些组件共同构成了线程的状态信息。 - **关系**:一个进程可以包含多个应用程序域,每个应用程序域又可以拥有多个线程。虽然线程可以在不同的应用程序域间...

    ios多线程编程

    配置线程属性时,可以设置线程的堆栈大小和线程本地存储等。 线程管理是确保多线程应用稳定运行的关键。它包括管理线程的生命周期、编写线程主体入口点以及中断线程等。特别要注意的是,编写线程主体入口点时,需要...

    java 多线程设计模式 进程详解

    本地调度支持 其他线程调度方法 总结 第七章 Java线程调度例子 线程池 循环调度 作业调度 总结 第八章 和同步相关的高级主题 同步术语 预防死锁 锁饥饿 非线程安全的类 总结 第九章 多处理器机器上的并行化 单...

    C语言实现 多线程文件传输

    总结,C语言实现多线程文件传输涉及到的关键技术包括:使用pthread库创建和管理线程,定义线程函数处理文件传输逻辑,通过同步原语如互斥锁和条件变量保证线程安全,以及可能的网络编程技术。这种实现方式能有效利用...

    java 多线程并发实例

    线程是程序执行的基本单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而共享堆内存。在Java中,创建线程主要有两种方式:继承Thread类和实现Runnable接口。在提供的实例中,我们可能会看到这两种方式的...

    java多线程编程总结

    线程本地存储,如 `ThreadLocal` 类,提供了线程安全的数据结构,使得每个线程拥有自己的副本,避免了数据竞争问题。 #### 四、Java线程:线程状态的转换 - **线程的状态** Java线程的状态包括新建 (`NEW`)、...

    面试中多线程问题

    "面试中多线程问题" 多线程是 Java 编程中一个重要...同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。

    C++JNI多线程回调java

    例如,可能有用于线程间同步的锁、条件变量,或者用于存储和传递数据的队列等。 总的来说,理解和实现"C++ JNI多线程回调java"涉及到对JNI接口的深入理解,对多线程编程的掌握,以及对Java并发模型的认识。这是一个...

    C# httpwebrequest 多线程下载类

    6. **同步与协调**:为了防止多个线程同时写入同一个文件,我们需要使用锁(`lock`关键字)或其他同步机制来确保线程安全。此外,我们还需要在下载开始前计算文件的总大小,以便合理分配每个线程的工作量。 7. **...

    Java多线程管理示例

    线程是操作系统分配CPU时间的基本单位,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈和一部分堆内存。Java通过Thread类提供了对线程的封装和控制,我们可以通过创建Thread对象并重写其run()方法来实现并发...

Global site tag (gtag.js) - Google Analytics