线程同步&线程池
线程同步&线程池
线程同步
线程不同步会出现的问题:
- 当多个线程操作同一资源时,会出现重复操作和和操作不存在的资源的问题,为了规避这一问题就需要线程的同步操作来实现资源的共同使用。
线程同步:
- 当多个线程操作同一资源时,给操作该资源的代码加上一把锁,当有一个线程拿到这把锁后,其他线程都不能操作带锁的资源代码,直至拿到锁的线程释放锁。
线程同步实现的3种方式:
同步代码块
synchornized(obj){
//涉及操作同一资源的代码
}
注: 没有静态的同步代码块
obj: 任意类型的对象,相当于一把锁,操作同一资源的而线程必须使用同一把锁。
如何保证多个线程使用同一把锁?
在设置线程任务,即定义线程对象时在成员变量的位置上声明一个对象,将声明的变量放在sychornized代码块中
/**
*模拟买票功能,开启多个线程,同时买一百张票
/
public class SaleTicket implements Runnable{
/
不同对象使用同一个变量
*/
private static int ticket=100 ;/**
*不同线程使用同一个锁对象
*/
private Object obj = new Object();
@Override
public void run() {
while(true) {
/**
* 使用synchornized(obj) {} 代码块
*/
synchronized (obj) {
if (ticket > 0) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "sale=====" + ticket);
ticket--;
}
}
}
}
} public class SaleTicketDemoTest {
public static void main(String[] args) {
SaleTicket sale = new SaleTicket();
//开启3个线程操作同一对象,从而操作同一资源
Thread th1 = new Thread(sale);
Thread th2 = new Thread(sale);
Thread th3 = new Thread(sale);
th1.start();
th2.start();
th3.start();
}
}
同步方法
public synchornied void 方法名(){
//涉及操作同一资源的方法
}
同步方法的锁:
同步方法的锁使用的是this对象,即new Thread(Xxx) 的Xxx对象
package com.test.java;/**
*模拟买票功能,开启多个线程,同时买一百张票
*/ public class SaleTicket implements Runnable{
/*
不同对象使用同一个变量
*/
private static int ticket=100 ; /**
*不同线程使用同一个锁对象
*/
private Object obj = new Object();
@Override
public void run() {
while(true) {
saleTicket();
}
}
/**
* 定义个个同步方法 public snychonized void XXX(){}
*/
public synchronized void saleTicket() {
if (ticket > 0) {
try {
Thread.sleep(500); } catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "sale=====" + ticket);
ticket--;
}
}
}
静态的同步方法
public static sychornized xxx(){
//涉及操作共同资源的代码
}
静态同步方法的锁是类名.class对象
package com.test.java;/**
*模拟买票功能,开启多个线程,同时买一百张票
*/ public class SaleTicket implements Runnable{
/*
不同对象使用同一个变量
*/
private static int ticket=100 ; /**
*不同线程使用同一个锁对象
*/
private Object obj = new Object();
@Override
public void run() {
while(true) {
saleTicket();
} /**
* 静态同步方法
*/ public static synchronized void saleTicket() {
if (ticket > 0) {
try {
Thread.sleep(500); } catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "sale=====" + ticket);
ticket--;
}
}
}
锁机制
Jdk1.5后在java.util.concurrent.lockslock的好处:解决了当共享资源的锁一直未被释放,其他线程无限等待的问题。
当多个线程都只是进行读操作,所以当一个线程在进行读操作时,其他线程只能等待无法进行读操 作。因此就需要一种机制来使得多个线程都只是进行读操作时,线程之间不会发生冲突,通过Lock就可以办到
Lock和synchornized的区别:- Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这 个类可以实现同步访问;
2. Lock和synchronized有一点非常大的不同,采用synchronized不需要用户去手动释放锁,当synchronized方法或者synchronized代码块执行完之后,系统会自动让线程释放对锁的占用;而Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。
lock的特点:
- 采用Lock,必须主动去释放锁,并且在发生异常时,不会自动释放锁。因此一般来说,使用Lock必须在try{}catch{}块中进行,并且将释放锁的操作放在finally块中进行,以保证锁一定被被释放,防止死锁的发生。通常使用Lock来进行同步的话
- Lock不是Java语言内置的,synchronized是Java语言的关键字,因此是内置特性。Lock是一个类,通过这 个类可以实现同步访问;
线程池
线程同步&线程池的更多相关文章
- 线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading
入门-------------------------------------------------------------------------------- 概述与概念 一个C#程序开始 ...
- Python并发编程-线程同步(线程安全)
Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...
- Qt QThread 线程创建,线程同步,线程通信 实例
1. 继承QThread, 实现run()方法, 即可创建线程. 2. 实例1 代码 myThread.h #ifndef MYTHREAD_H #define MYTHREAD_H #includ ...
- C#线程同步--线程通信
问题抽象:当某个操作的执行必须依赖于另一个操作的完成时,需要有个机制来保证这种先后关系.线程通信方案:ManualResetEventSlim.ManualResetEvent.AutoResetEv ...
- 细说C#多线程那些事 - 线程同步和多线程优先级
上个文章分享了一些多线程的一些基础的知识,今天我们继续学习. 一.Task类 上次我们说了线程池,线程池的QueueUserWorkItem()方法发起一次异步的线程执行很简单 但是该方法最大的问题是 ...
- C#并行编程(6):线程同步面面观
理解线程同步 线程的数据访问 在并行(多线程)环境中,不可避免地会存在多个线程同时访问某个数据的情况.多个线程对共享数据的访问有下面3种情形: 多个线程同时读取数据: 单个线程更新数据,此时其他线程读 ...
- Linux多线程编程——多线程与线程同步
多线程 使用多线程好处: 一.通过为每种事件类型的处理单独分配线程,可以简化处理异步事件的代码,线程处理事件可以采用同步编程模式,启闭异步编程模式简单 二.方便的通信和数据交换 由于进程之间具有独立的 ...
- java SE学习之线程同步(详细介绍)
java程序中可以允许存在多个线程,但在处理多线程问题时,必须注意这样一个问题: 当两个或多个线程同时访问同一个变量,并且一些线程需要修改这个变量时,那么这个 ...
- Java之线程,常用方法,线程同步,死锁
1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...
随机推荐
- 第一个shell脚本(一)
第一个脚本 [root@ipha-dev71- exercise_shell]# ll total -rw-r--r-- root root Aug : test.sh [root@ipha-dev7 ...
- 在Mac平台用Sublime编辑器使用Git并连接github
近期闲来无事,学习一下Git版本控制的东西,首先是要在我的pc上学会如何向git上提交我的代码,记录一下过程以及遇到的问题. 一.Mac下Sublime Text 3整合Git 来源于一个技术教程:h ...
- 基础安全术语科普(五)——crypter
crypter(加壳):使病毒逃过反病毒软件检测的技术 UD类加壳病毒:只有%50至%25的软件能检测出是病毒. FUD类加壳病毒:完全不会被检测出来. 加壳技术有两个主要组件: 1.client — ...
- 那些惊艳的 GIS 轮子
一.前言 GIS 涉及测绘.几何拓扑.人文社科等多方面的科学知识.在 .Net 平台下有着许多优秀的开源产品,比如:MapWindow.SharpMap.WorldWind等.而在这其中,Coordi ...
- 线性回归 python 代码实现
本代码参考自:https://github.com/lawlite19/MachineLearning_Python#%E4%B8%80%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%B ...
- Excel接口导出,导入数据库(.Net)
public ActionResult TestExcel(string filePath) { return View(); } /// <summary> /// 根据Excel列类型 ...
- 07 python学习笔记-写一个清理日志的小程序(七)
#删掉三天前的日志 #1.获取到所有的日志文件, os.walk #2.获取文件时间 android 2019-09-27 log,并转成时间戳 #3.获取3天前的时间 time.time() - 6 ...
- nsq (三) 消息传输的可靠性和持久化[一]
上两篇帖子主要说了一下nsq的拓扑结构,如何进行故障处理和横向扩展,保证了客户端和服务端的长连接,连接保持了,就要传输数据了,nsq如何保证消息被订阅者消费,如何保证消息不丢失,就是今天要阐述的内容. ...
- vue 组件样式如何不影响全局
可以在 "style" 标签中添加 "scoped" 属性. <style scoped> .red { color: #f00; } </s ...
- 【ASP.NET Core学习】Razor页面
准备工作 初始化空的项目(终端输入:dotnet new web -n=Razor) Nuget添加Microsoft.EntityFrameworkCore.SqlServer 和 Microsof ...