`

线程本地锁

 
阅读更多
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();
}
分享到:
评论

相关推荐

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

    多线程下访问公共变量时,一般lock和 启用线程本地变量 两者的效率比较。

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

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

    Java多线程安全问题和锁

    多线程安全问题和锁 文章目录多线程安全问题和锁线程在jvm中的特点锁的出现synchronized 关键字-监视器锁monitor lock死锁的产生和避免 什么是线程安全问题? 当多个线程同时操作同一个数据是,可能会出现数据不一样...

    java线程学习笔记

    2.3 线程本地存储(Java.lang.ThreadLocal) 15 2.4 线程阻塞 17 2.4.1 调用sleep(millisecond)使任务进入休眠状态 17 2.4.2 等待输出与输入 17 2.4.3 对象锁不可用 17 2.4.4 通过wait()使线程挂起。 17 2.5 线程...

    深入分析C# 线程同步

    上一篇介绍了如何开启线程,线程间相互传递参数,及线程中本地变量和全局共享变量区别。 本篇主要说明线程同步。 如果有多个线程同时访问共享数据的时候,就必须要用线程同步,防止共享数据被破坏。如果多个线程不会...

    多线程编程指南PDF

    多线程基础介绍.........................................................................................................................................15 定义多线程术语...................................

    多线程编程指南(系统描述了线程标准 线程同步 多线程编程原则 等)

    1 多线程基础介绍15 定义多线程术语15 符合多线程标准16 多线程的益处17 提高应用程序的响应 17 有效使用多处理器17 改进程序结构17 占用较少的系统资源17 结合线程和RPC(远程过程调用)18 多线程概念18 并发性和...

    java分布式锁实现代码

    通过redisson实现分布式锁 通过curator框架实现共享锁,读写锁 项目下载下载,启动本地redis和zookeeper即可; 代码供大家参考,如有不对的地方希望大家指出来。

    Python 标准库之 threading (线程并行)

    文章目录示例返回活跃线程的数量返回活跃线程列表创建一个线程为线程绑定任务为线程任务传递参数运行线程阻塞调用的线程 (守护线程)多线程访问临界值线程锁参考线程对象锁对象 示例 返回活跃线程的数量 In [1]: ...

    threaddump-analyzer:JVM线程转储分析器

    当我们有线程在等待未命名的锁,而我们找不到它在等待哪个锁时,就会发生这种情况。 当然这是错误的,但是如果我们不能说,我们就不能说。 在“顶级运行方法”列表中,列出每个顶级方法的线程名称,并将它们全部...

    Yii+MYSQL锁表防止并发情况下重复数据的方法

    本文实例讲述了Yii+...//本地读锁定表,其他线程的insert未被阻塞,update操作被阻塞 lock table 写锁定 如果一个线程在一个表上得到一个 write锁,那么只有拥有这个锁的线程可以从表中读取和写表。其它的线程被阻

    JAVA2核心技术(中文的PDF).part3.rar

    全面覆盖Java 2技术的高级主题,包括:多线程、集合框架、网络API、数据库编程、分布式对象等,深入探究了Swing、Java 2D API、JavaBean、Java安全模式、XML、注释、元数据等主题,同时涉及本地方法、国际化以及JDK ...

    java8看不到源码-dlock:一种有效可靠的分布式锁

    java8 看不到源码DLock - 分布式锁 ...并且重试线程会周期性的唤醒CLH队列的头线程进行重试,这样每个进程只有一个线程可以参与锁竞争,避免了不必要的锁竞争。 同时,还为吞吐量提供了不公平锁。 快速

    zk_lock:用zk实现的分布式锁

    zk_lock 用zk实现的分布式锁 实现分布式锁 保留线程中断特性 保留条件锁特性 同一进程内多线程竞争,进行本地排队 支持本地排队优先执行策略

    Linux系统下,使用“epoll+线程池”技术,通过makefile管理的简单项目-“服务器与客户端完成通信并处理小型业务”

    技术涉及:网络初始化、epoll模型、线程池、线程同步、互斥锁 适用人群:在校大学生,并对网络通信及线程安全问题有一定基础了解 适用系统:Linux操作系统 使用场景:本地主机、局域网、广域网(要有公网IP) 项目...

    Middleware:攀登之路..

    线程本地 易挥发,指令重排序 同步原理与应用 原子操作的实现原理 并发编程的内存模型 多线程的应用 Java中的锁 Java的并发容器 不安全 线程池 执行者 MySQL 数据库 MySQL基本数据类型 MySQL基本命令 SQL MySQL...

    java核心面试

    编译源代码为本地机器码执行。 内存泄露是一部分内存无法回收。溢出是说内存不够用了。泄露可能在将来会导致溢出 当对象在程序中不会被使用,但却有其他对象持有该对象时会发生溢出。比如出现持有的环的情况。 ...

    java核心面试技术点

    编译源代码为本地机器码执行。 内存泄露是一部分内存无法回收。溢出是说内存不够用了。泄露可能在将来会导致溢出 当对象在程序中不会被使用,但却有其他对象持有该对象时会发生溢出。比如出现持有的环的情况。 ...

    IBM heapdump analyzer

    在一些平台上,在有些情况下,javacore也被称为javadump,它包含jvm和应用程序相关的在特定时刻的一些诊断信息,如操作系统,应用程序环境,线程,native stack本地堆,锁,和内存的信息。在生成heapdump文件的时候...

Global site tag (gtag.js) - Google Analytics