Java基础笔记:Day_14 多线程与synchronized

《Java开发十日速成:零基础保姆级教程(附20000字实战+流程图)》Day7:多线程与并发编程 十天掌握Java核心技能,小白也能写出企业级代码。:解锁《SpringBoot+Vue全栈开发》系列课程。:私信【Java10天】领取完整工程文件(含测试用例)(Day7内容结束,持续更新中…:避免技术升级时找不到学习路径。 阅读详情

一、基本概念

1.进程与线程
进程:有独立的内存空间,进程中的数据存放空间(堆空间和栈空间)是独立的,至少一个线程。
线程:堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间是可以影响的,又称之为轻型进程或者进程元。

线程的先后取决于JVM,程序员无法控制。JVM采用的是抢占式调度,没有分时调度,因此可能造成多线程执行结果的随机性。

2.创建线程
最传统的两种方式:
1.使用继承手段:继承Thread类
2.使用接口手段:实现Runnable接口

对于法1步骤:
①定义一个类A继承于java.lang.Thread类
②在A类中覆盖Thead类中的run方法
③我们在run方法中编写需要执行的操作—>run方法里的线程执行体。
④在我们的main方法(main线程)中创建一个线程对象并且启动。

A类 a =new A类();//创建一个线程
a.start();//启动线程。

注意:千万不用调用run方法。否则依然还是只有一个线程。
代码实例:

class MusicThread extends Thread
{
	@Override
	public void run() {
		for(int i = 0; i < 50 ;i++) {
			System.out.println("Music" + i);
		}
	}
}

public class Demo {
	public static void main(String[] args) {
		for(int i = 0; i < 50 ; i++){
			System.out.println("Game" + i);
			if(i == 10) {
				MusicThread mt = new MusicThread();
				mt.start();
			}	
		}
	}
}

对于法2的步骤:
①定义一个类A实现于java.lang.Runnable接口
②在A类中覆盖Runnable接口中的run方法。
③在run方法中编写需要执行的操作
④在我们的main方法(main线程)中创建一个线程对象并且启动。

Thread a =new Thread(new A());//创建一个线程,注意:A类此时不是线程类
a.start();//启动线程。

此刻,Thread构造器需要一个Runnable对象/Runnable实现类的对象。
代码实例:

class MusicThread implements Runnable
{
	@Override
	public void run() {
		for(int i = 0; i < 50 ;i++) {
			System.out.println("Music" + i);
		}
	}
}

public class Demo {
	public static void main(String[] args) {
		for(int i = 0; i < 50 ; i++){
			System.out.println("Game" + i);
			if(i == 10) {
				Runnable target = new MusicThread();
				Thread mt = new Thread(target);
				mt.start();
			}	
		}
	}
}

对于两种方式:
继承方式:
①java中类是单继承的,如果继承了Thread了,该类就不能再有其他父类。
②从操作上来说,继承方式更为简单,操作也十分简单。
③从多线程共享同一个分析,继承方式不能做到
实现方式:
①java中类可以实现多接口,此时还可以继承其他类。
②从操作上分析,实现方式稍微复杂,获取线程的名字也比较复杂。
③从多线程共享同一个资源上讲,实现方式可做到。
建议多用实现方式创建线程。

3.线程的安全性问题

案例:

class Apple implements Runnable
{
	private int num = 10;
	
	@Override
	public void run() {
		for(int i = 0 ; i < 10 ; i++) {
			if(num > 0) {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(Thread.currentThread().getName()+"吃了"+ (num--) + "号苹果");
			}
		}
	}
}

public class Demo {
	public static void main(String[] args) {
		Apple a = new Apple();
		//三个线程共用同一个Apple对象
		new Thread(a,"A").start();
		new Thread(a,"B").start();
		new Thread(a,"C").start();
	}
}

在输出后,可以看到一个不正常的现象:
在这里插入图片描述
8,9号苹果都被吃了两次。C和A都拿到了编号为9的苹果,打印出来,还没来得及数num–的时候,A和C已经做了-1的操作,线程进入了睡眠,num还剩8个,B线程来了打印其值。此时A线程醒来做打印操作。
解决方案:A线程进入操作的时候,B和C都只能在外等着。保证打印和苹果减一操作必须同步完成。方式有3:
①同步代码块
②同步方法
③锁机制

法1:同步代码块

语法:

synchronized(同步锁)
{
	//需要同步操作的代码块
}

为了保证每个线程都能正常执行原子操作,Java引入了线程同步机制。Java程序运行使用任何对象作为同步监听对象,但是一般的,我们把当前并发访问的同步资源作为同步资源作为同步监听对象。
注意:在任何时候都只运行一个线程拥有同步锁。(谁拿到锁就进入代码块,其他的线程只能在外等着)

将上面的部分代码修改一下:

class Apple implements Runnable {
	private int num = 10;

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			//同步代码块
			synchronized (this) {//this表示属于多线程共享资源
				if (num > 0) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "吃了" + (num--) + "号苹果");
				}
			}
		}
	}
}

法2:同步方法
使用synchronized修饰的方法,就叫同步方法。保证了A线程执行该方法的时候,其他线程只能在外等着。

synchronized public void doWork()
{
	//CODE
}

同步锁是谁?对于非static方法,同步锁就是this,对于static方法,我们使用当前方法所在类 的字节码对象(Apple.class)
但是,不要使用synchronized修饰run方法,因为修饰后某一线程就执行完了。就好比是多个线程出现了串行。正确操作是:把需要同步的代码块写在一个新的方法中,在run方法中去调用它。

class Apple implements Runnable {
	private int num = 10;

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			testMethod();
		}
	}

	synchronized private void testMethod() {
		if (num > 0) {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName() + "吃了" + (num--) + "号苹果");
		}
	}
}

synchronized的优劣性:
优点:保证了多线程并发访问时候的同步操作,避免了线程的安全性问题。
缺点:使用synchronized的方法/代码块性能会有所下降。
建议:尽量减少synchronized的作用域。

法3:锁机制

Lock机制提供了比synchronized更为广泛的锁定操作,同步代码块/同步方法具有的功能lock都有,更能体现面向对象。

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

class Apple implements Runnable {
	private int num = 10;

	private final Lock lock = new ReentrantLock();

	@Override
	public void run() {
		for (int i = 0; i < 10; i++) {
			testMethod();
		}
	}

	private void testMethod() {
		//进入方法,立即加锁
		lock.lock();//获取锁
		try {
			if (num > 0) {
				Thread.sleep(10);
				System.out.println(Thread.currentThread().getName() + "吃了" + (num--) + "号苹果");
			}
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();//释放锁
		}
	}
}
Mac M1安装Hive 如果你确定装过mysql,但是执行上述命令后,发现不存在mysql命令,那说明你的系统环境没有配置。出现一段空白,接着出现Initialization script completed。关闭hiveServer2时,执行如下命令查看hive进程;执行上面命令后,若有结果输出,则证明配置完成了。如果出现mac权限问题,解决方法参考。就可以见到hive的web界面了。若出现路径,则存在mysql。配置好后保存,使配置文件生效。用户名hive,密码hive。用户名通过如下命令查看。通过如下命令杀死该进程。 阅读详情

相关推荐

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

电竞护航系统成品搭建俱乐部点单小程序开发三角洲小程序搭建

dapengglove的博客 1682

阳哥JVM笔记

JVM体系结构 类加载器(快递员): 只负责加载java文件,编译后的class文件在文件开头有特定的文件表示,将class文件字节码内容从硬盘加载到JVM内存中并将这些内容转换成方法区的运行时数据结构,至于是否可以正常运行由Execution Engine决定。加载class后为模板Class,该模板存放类的结构信息,一个模板可以实例化多个实例 3个classLoader:启动加载器Bootstrap(C++),扩展加载器Extension(Java),应用程序类加载器AppClassLoa

qq_43601023的博客 542

weblogic等保测评操作过程

weblogic网络安全等级测评保护操作

qq_48257021的博客 2757

【26天高效学习Java编程】Day19:Java 多线程

JAVA 最难学的部分是哪里?很多朋友都会说:「 java 多线程 」。随着业务量和数据的增加,我们会不可避免地使用多线程的方式处理数据,同时在 Java 职位的面试中,多线程也是必考的高阶知识点之一,可以说,java多线程是衡量一名 Java 程序员是否资深的关键标准之一。今天,我们就来学习一下 Java 多线程的概念吧!本文将详细讲解Java多线程的创建方式、线程状态、高并发、线程安全、Synchronize以及Lock的使用、Volatile关键字、原子类、并发包、线程池的创建以及死锁等。

Learning_xzj的博客 3200

AI自动打游戏全攻略:从环境搭建到Agent训练实战

本文系统介绍了AI自动打游戏的技术实现方案,重点解析了强化学习(DQN算法)在贪吃蛇游戏中的应用。文章从技术选型入手,对比了强化学习与计算机视觉两种方案,详细说明了开发环境配置步骤,并深入讲解了DQN模型构建、游戏环境封装、训练优化等核心环节。通过经验回放和目标网络等技术,有效提升了AI的学习效率和稳定性。该方案具有通用性,只需调整参数即可应用于其他简单游戏场景,为开发者实现游戏AI提供了完整的技术路径。

milk416666的博客 4121

实战!在 AMD RX 9070 XT (16G) 上使用原生 Windows ROCm 7.1 部署 ComfyUI + Z-Image-Turbo

本文详细介绍了如何在Windows系统下为AMD Radeon RX 9070 XT显卡配置Z-Image-Turbo AI绘图环境。主要内容包括:安装VS Build Tools和最新显卡驱动,配置Conda Python 3.12环境,安装ROCm 7.1.1 SDK及PyTorch适配版本,部署ComfyUI可视化界面。重点解决了AMD显卡在AI绘图中的适配问题,通过--use-split-cross-attention参数优化显存使用,最终成功搭建了可在消费级16G显存设备上运行的AI绘图环境

qq_33614778的博客 4681

Day38-Java基础之多线程2

提到池,大家应该能想到的就是水池。水池就是一个容器,在该容器中存储了很多的水。那么什么是线程池呢?线程池也是可以看做成一个池子,在该池子中存储很多个线程。线程池存在的意义:系统创建一个线程的成本是比较高的,因为它涉及到与操作系统交互,当程序中需要创建大量生存期很短暂的线程时,频繁的创建和销毁线程对系统的资源消耗有可能大于业务处理是对系统资源的消耗,这样就有点"舍本逐末"了。针对这一种情况,为了提高性能,我们就可以采用线程池。线程池在启动的时,会创建大量空闲线程,当我们向线程池提交任务的时,线程池就。

m0_46053885的博客 1079

TDISP(TEE Device Interface Security Protocol)软件操作流程

/ 1. SPDM会话相关定义(🔶1-37、🔶1-187)// SPDM会话ID// AES-256-GCM加密密钥(TDISP要求)// 初始向量// 会话是否激活// 2. IDE流配置(🔶1-52、🔶1-625)// IDE流ID// 4个子流的AES密钥(覆盖所有子流类型)// 密钥是否已配置// 3. TDI状态与配置(🔶1-207、🔶1-210)TDI_CONFIG_UNLOCKED = 0, // 初始配置态。

inquisiter 1429

Java多线程Day04-多线程之synchronized关键字

synchronized关键字synchronized原理synchronized基本规则synchronized方法synchronized代码块全局锁实例锁 synchronized原理 Java中,每个对象有且仅有一个同步锁.即同步锁是依赖对象而存在的 调用某个对象的synchronized方法时,就获取了该对象的同步锁 不同线程之间对同步锁的访问是互斥的: 某个时间点,对象的同步锁只能被一个线程获取 通过使用同步锁,就可以在多线程中,实现对象或者方法的互斥访问 synchronized基本

攻城狮Chova的博客 385

18、探索隐私工程技术的前沿:从理论到实践

本文深入探讨了隐私工程技术的核心概念、关键技术及其应用场景,分析了加密技术、访问控制和用户界面设计等在隐私保护中的作用,并结合数据库保护、物联网设备等实际场景进行阐述。同时,文章还讨论了隐私工程技术面临的挑战与未来发展趋势,提出了数据最小化原则、差分隐私、隐私增强技术等优化策略以及隐私设计、隐私影响评估等最佳实践,最后展望了新兴技术对隐私保护的影响及法规推动下的发展方向。

weixin_35307279的博客 373

SAP ABAP SM50 的另类用途 - ABAP 工作进程对数据库表读取操作的检测

今天是2020年五一国际劳动节,Jerry祝大家劳动节快乐。 虽然五一国际劳动节来源于一百多年前国外无产阶级的一次大罢工,但由于国情原因,国内很多行业的从业人员,好像天生就是劳碌命。比如程序员行业。 2014年五一劳动节,我在和一个不是总能重现的SAP CRM incident做斗争。详情参考Jerry之前的文章记一次SAP开发工程师给微软Azure报incident的体验. 当时处理完这个复杂...

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 8676

【Java教程】Day15-09 多线程:线程同步——Java中的线程协调和synchronized应用

在本篇教程中,我们将继续探索Java中的多线程编程,特别是synchronized的使用和线程协调的技巧。我们将以一个任务队列为例,讲解如何使用synchronized解决多线程竞争问题,并进一步探讨如何避免死循环和正确使用wait与notify方法来实现线程协调。

max202011161630的博客 522

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

day14多线程02 有关死锁的java实现

day14 多线程02 1. lock锁 java.util.concurrent(多线程的使用) Lock锁对象 VS synchoronized 锁对象 区别 1. synchronized 锁对象,只提供了用来模拟锁状态的标志位(加锁和释放锁), 但是加锁和释放锁的行为,都是由jvm隐式完成(和synchronized 锁对象没关系), 所以synchronized 锁对象不是一把完整的锁 2.一个Lock对象,就代表一把锁,而且还是一把完

be_stronger的博客 235

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【Java教程】Day15-10 多线程:线程同步——ReentrantLock与synchronized的对比与应用

在Java中,线程同步是一个关键的多线程编程问题。为了保证共享资源的安全,Java提供了synchronized关键字用于加锁。然而,synchronized存在一些问题,比如它是比较“重”的锁,获取锁时线程必须一直等待,且无法提供额外的控制机制。为了弥补这些不足,从Java 5开始,Java引入了更为灵活和高级的并发工具——java.util.concurrent.locks包。该包提供了ReentrantLock类,可以有效替代传统的synchronized锁。

max202011161630的博客 466

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java并发编程实战 Day 2:线程安全与synchronized关键字

当多个线程同时访问某个对象或方法时,如果其行为不会因为线程调度顺序的不同而产生不可预测的结果,则该对象或方法是线程安全的。在 Java 中,线程安全的核心问题是共享资源的竞争。如果不加控制,多个线程可能同时修改共享状态,导致数据不一致、逻辑错误等问题。今天我们系统性地学习了关键字的使用方式、底层实现机制以及性能优化策略。是 Java 实现线程同步的基础机制支持实例方法、静态方法、代码块三种使用方式JVM 底层通过 Monitor 和对象头实现锁机制锁升级机制显著提升性能。

在未来等你的专栏 974

【Java教程】Day15-11 多线程:线程同步——使用ReentrantLock比直接使用synchronized更安全

在多线程编程中,线程同步是一项常见的需求,确保多个线程在访问共享资源时不会发生冲突。在Java中,synchronized关键字常常被用来实现线程同步,但它存在一些限制和不足。为了更灵活、更高效地处理并发,Java 5引入了java.util.concurrent.locks包,其中的ReentrantLock提供了更强大的功能,能够替代synchronized来进行线程同步。

max202011161630的博客 345

蜗牛学苑 Java 学习 Day14|多线程入门、线程同步思维导图复盘

重生之我在蜗牛学苑学代码

weixin_75217422的博客 297

Day37 | 线程安全与synchronized

本文介绍了Java多线程编程中的线程安全问题及解决方案。文章通过银行账户取款案例,展示了多线程环境下数据错乱的典型问题,分析了竞态条件和原子性概念。重点讲解了synchronized关键字的三种用法:修饰实例方法、静态方法和代码块,并详细说明了其实现原理和优化过程(偏向锁、轻量级锁、重量级锁)。最后通过StringBuffer/StringBuilder和Vector/ArrayList的对比,展示了synchronized在JDK中的实际应用。

懒惰蜗牛的博客 1072

Java多线程——Day03

多线程Day 03 本文总结自B站狂神说JAVA 1. 线程同步 在Day01中有一个多个线程操作同一个对象的案例,没有处理好并发,所以出现了错误。解决方案:将需要同时访问该对象的线程进入这个对象的等待池形成队列,等前面的线程完毕,下一个线程才可以继续使用,这种方案叫做线程同步。线程同步必须要有队列和锁。说到底线程同步是用来解决线程的安全性问题。缺陷:会损失一部分性能,一个有锁的线程会导致其它需要此锁的线程挂起;一个优先级高的线程如果等待一个优先级低的线程的锁,会导致优先级倒置。 加锁的方法是:在需要同

风间琉璃の博客 177

java多线程学习下(重点)day14

Java多线程,线程的状态,线程同步,线程协作

m0_47945117的博客 218

day14 15synchronized的好与坏

qq_42722278的博客 142

【Java教程】Day15-06 多线程:线程调度与共享变量的同步问题

在多线程编程中,线程的调度由操作系统决定,而程序本身无法对线程的调度进行控制。这意味着,在多线程环境下,任何一个线程都可能在执行过程中被操作系统暂停,并在稍后继续执行。这个特性带来了一个在单线程模型中并不存在的问题:共享变量的并发访问可能导致数据不一致。

max202011161630的博客 643

JAVA学习DAY-14

Java实现多线程、锁和死锁

m0_56017821的博客 291

【Java每日一练-Day14】synchronized底层实现全解析!锁升级与线程安全核心

核心逻辑:通过synchronized(锁对象)修饰代码块,锁对象可自定义(可以是this、Class对象,或任意Object实例)。仅对进入该代码块的线程进行互斥控制,粒度更细,性能更优(推荐优先使用)。// 自定义锁对象(推荐使用专门的锁对象,避免锁对象被意外修改)// 锁对象为lock,仅临界区代码被同步count++;// 临界区代码,保证原子性// 非临界区代码,多个线程可并行执行System.out.println("非临界区代码,无需同步");i++) {

Xiong_Ji537的博客 857

Java 内存管理与多线程编程深度解析

本文深入探讨了Java内存管理与多线程编程两大核心主题。首先解析了Java程序执行流程和JVM内存结构,重点讲解了栈内存、堆内存和方法区的功能特点。然后通过递归算法和斐波那契数列案例,展示了栈内存的实际应用。在多线程部分,详细阐述了线程调度机制和并发控制方案,包括synchronized锁和Atomic原子类的使用场景及性能对比。最后针对常见问题如ABA问题和自旋过度问题,提供了AtomicStampedReference等解决方案。全文结合代码示例,帮助读者从理论到实践掌握Java高效并发编程的关键技术。

2503_93734861的博客 946

多线程基础篇

创建线程的方式 3种 继承Thread 实现Callable接口 实现Runnable接口’1、Thread本身就是线程 需要继承 重写run方法 run方法没有返回值 run方法不能抛异常​ 只能自己try catch 自己处理异常 外部不能获取到异常信息2、实现Runnable接口 需要实现 实现其中的run方法 run方法没有返回值 run方法不能抛异常​ 只能自己try catch 自己处理异常 外部不能获取到异常信息。

m0_69443943的博客 1032
上一篇: Java基础笔记:Day_13 异常机制相关
下一篇: Java基础笔记:Day_15 线程通信
Panda不姓潘
博客等级 码龄8年 152粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值