java多线程基础2
2020-02-15 21:03 默默不语 阅读(186) 评论(0) 编辑 收藏 举报1.线程加锁
多个线程需要共享对同一个数据的访问。如果每个线程都会调用一个修改共享数据状态的方法,那么,这些线程将会互相影响对方的运行。在Java语言中,引入对象互斥锁的概念,保证共享数据操作的完整性。每个对象都对应一个可称为“互斥锁”的标记,这个标记保证在任一时刻,只能有一个线程访问对象。就像上一篇博客讲到用多线程模拟售票时,会出现两个车站卖同一张票的时候,这种情况就需要我们在对卖票时加锁,有一个线程访问这段代码时,别的线程就不能访问,保证不会发生两个线程同时访问同一个数据的情况。java的加锁方式有以下两种:
①synchronized同步代码块
当某个对象用修饰时,表明该对象在任一时刻只能由一个线程访问。
语法:
synchronized(this){ //需要同步的代码; }
示例:
public void run() { while(sign) { synchronized (this) { if(ticket >= 1) { System.out.println(Thread.currentThread().getName() + ":" + this.ticket--); }else{ sign = false; } } } }
或者
public synchronized void sale(){ ticket--; }
②显式加锁:JDK5.0后提出,注意,我们加的锁的粒度越细越好。
语法:
private static final Lock lock = new ReentrantLock(); //创建Lock实例 lock.lock(); //获取锁 //需要同步的代码 lock.unlock(); //释放锁
实例:
public void run() { while(sign) { lock.lock(); if(ticket >= 1) { System.out.println(Thread.currentThread().getName() + ":" + this.ticket--); }else { sign = false; } lock.unlock(); } }
2.线程让步
线程让步为暂停当前正在执行的线程对象,把执行机会让给别的线程。
语法:
Thread.yield()
代码:
package com.cmq.test; /** *@author chenmeiqi *@version 2020年2月 */ public class ThreadYield { public static void main(String[] args) { System.out.println("主线程:" + Thread.currentThread().getName()); Thread thread1 = new Thread(new MyThread2()); thread1.start(); Thread thread2 = new Thread(new MyThread2()); thread2.start(); } } class MyThread2 implements Runnable{ public void run() { //线程体 for(int i = 0;i<100;i++){ System.out.println(Thread.currentThread().getName()+ ":" + i); if(i % 10 == 0){ Thread.yield(); //线程让步 } } } }
运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!