多线程之线程的通信以及死锁

多线程——死锁和线程通信 死锁:在多线程程序中,使用了多把锁,造成线程之间相互等待.程序不往下走了。造成死锁的原因1.多个线程间,相互持有对方的对象锁2.同步代码块嵌套如何排查死锁问题1.命令终端通过 CMD 进入,输入 jps -l ,查看进程,锁定进程号通过 jstack 进程号 ,进一步去锁定 Found 1 deadlock. 的问题2.图形化方式通过jconsole命令进入,选择当前类的进程,找到线程的选项卡->检测死锁如何解决问题1.不要同步代码块嵌套。 阅读详情

1 前言 刚刚上一页说了线程的同步,这次我们来聊一聊线程的通信以及死锁。
2线程的通信
2.1先上一段代码


        class Communication implements Runnable {
            int i = 1;

            public void run() {
                while (true) {
                    synchronized (this) {
                        notify();
                        if (i <= 100) {
                            System.out.println(Thread.currentThread().getName() +
                                    ":" + i++);
                        } else
                            break;
                        try {
                            wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }

2.3 wait() 与 notify() 和 notifyAll()

  • wait():令当前线程挂起并放弃CPU、同步资源并等待,使别的线程可访问并修改共享资源,而当前线程排队等候其他线程调用notify()或notifyAll()方法唤醒,唤醒后等待重新获得对监视器的所有权后才能继续执行。
  • notify():唤醒正在排队等待同步资源的线程中优先级最高者结束等待
  • notifyAll ():唤醒正在排队等待资源的所有线程结束等待
  • 这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则会报java.lang.IllegalMonitorStateException异常。
  • 因为这三个方法必须有锁对象调用,而任意对象都可以作为synchronized的同步锁,因此这三个方法只能在Object类中声明。

2.3.1 wait() 方法

  • 在当前线程中调用方法: 对象名.wait()
  • 使当前线程进入等待(某对象)状态 ,直到另一线程对该对象发出 notify (或notifyAll) 为止。
  • 调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)
  • 调用此方法后,当前线程将释放对象监控权 ,然后进入等待
  • 在当前线程被notify后,要重新获得监控权,然后从断点处继续代码的执行。

2.3.2 notify()/notifyAll()方法

  • 在当前线程中调用方法: 对象名.notify()
  • 功能:唤醒等待该对象监控权的一个/所有线程。
  • 调用方法的必要条件:当前线程必须具有对该对象的监控权(加锁)

3 简单介绍一下 死锁

3.1什么是死锁
不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续

3.2解决方法
专门的算法、原则
尽量减少同步资源的定义
尽量避免嵌套同步

  • 完结
C++11 - thread多线程编程,线程互斥和同步通信,死锁问题分析解决 c++11 thread线程库使用,线程互斥,互斥锁,死锁问题分析定位 阅读详情

相关推荐

C++多线程编程,线程互斥和同步通信,死锁问题分析解决

c/c++ linux服务器开发相关视频解析: 后台开发第178讲|【零声学院官方视频】epoll原理剖析以及reactor模型应用|1. epoll原理剖析 2. 单reactor原理以及应用 聊聊线程面试那些事||线程起源||线程模型||进程和线程的联系和区别||为什么需要线程池 c/c++ linux服务器开发免费学习地址:c/c++ linux后台服务器高级架构师 C++11的多线程类thread C++11之前,C++库中没有提供和线程相关的类或者接口,因此在编写多线程程..

Linux高级开发的博客 706

JUC-多线程锁

多线程锁的练习题 1、标准访问,先打印短信还是邮件 class Phone { public synchronized void sendSMS() throws Exception { Thread.sleep(400);题【2】添加延时 System. out .println( "------se...

weixin_30922589的博客 258

【Creo】关于Creo一换网络就报错许可证丢失问题解决方案

依照我的个人理解,Creo只要一更换网络,则其许可证里面的网卡参数和现在的网络就对不上了,所以就会出现报错,并且有可能是报错代码(-9),提示许可证激活有问题。

weixin_52002180的博客 6036

windows 多线程编程的几点经验 (防止死锁)

windows 多线程编程的几点经验 (防止死锁) 作者: smilestone322 (1 篇文章) 日期: 八月 3, 2011 在 5:48 下午   1) 不要在线程函数体内操作MFC控件,不要再线程里面调用UpdateData函数更新用户界面,而应该尽量采用发

Tinna_zhang的专栏 429

医药行业SAP序列号管理深度解析:如何满足GMP合规要求

本文深度解析了医药行业如何利用SAP序列号管理构建满足GMP合规要求的数字化追溯体系。文章详细阐述了SAP序列号在实现从生产到患者全流程“一物一码”精准追溯中的核心作用,并探讨了其与质量管理、冷链监控等系统的关键集成配置,为医药企业应对严格监管、保障产品质量与安全提供了切实可行的技术方案。

backprop5master的博客 655

医学超声影像研究——从拒稿到录用:我的UMB投稿实战复盘

本文分享了作者将一篇关于超声影像中肿瘤传统分类方法的研究论文,从被其他期刊拒稿到最终被《Ultrasound in Medicine & Biology》录用的完整实战经验。文章详细复盘了心态调整、精准选刊、针对UMB期刊的稿件精修、投稿系统操作细节以及与审稿人有效沟通回复的全过程,为医学影像领域的科研工作者提供了宝贵的投稿策略与实操指南。

stem5的博客 492

wait/notify机制

wait/notify(等待/通知)机制在生活中比比皆是,比如在就餐时就会出现,如图:厨师和服务员要在"菜品传递台"上交互,在这期间会想到几个问题:1)厨师做完一个菜的时间未知,所以厨师将菜品放到"菜品传递台" 上的时间也未知。2)服务员取到菜的时间取决于厨师,所以服务员就有"wait"状态。3)服务员如何能取到菜呢?这又得取决于厨师。厨师将菜放在“菜品传递台”上,其实就是相当于一种notify,这时服务员才可以拿到菜并交给就餐者。4)在这个过程中出现了“wait/notify机制”。

m0_62943934的博客 762

远程桌面连接失败?手把手教你解决CredSSP加密Oracle漏洞(Win10/Win11通用)

本文详细解析了Windows远程桌面连接因CredSSP加密Oracle漏洞安全更新导致的“身份验证错误”问题。文章从原理入手,提供了通过组策略编辑器(适用于专业版)和注册表编辑器(适用于家庭版)两种核心解决方案,指导用户将安全策略调整为推荐的“缓解”模式,以在保障安全的前提下恢复连接,并给出了高级脚本处理与安全最佳实践。

u6v7w8x的博客 724

wait和notify基本原理以及应用场景

wait和notify是object中的方法,就是等待和唤醒。一个线程持有锁但是需要等待一些资源,那么就先进入等待队列,其他线程可以先持有锁并执行同步代码块中的内容,等到带着资源的另一个线程抢占到锁,并唤醒等待线程,等待线程就重新进入到阻塞队列进行排队,如果当前无其他线程竞争,就可以直接抢占锁并执行。 本文章包含了wait和notify以及相关的设计模式。...

Barbiz的博客 4814

Unity必学:Protobuf-net预编译实战

本文深入解析Unity项目使用Protobuf-net Precompile的必要性。作为高效跨平台序列化方案,Protobuf-net解决了Unity工程在网络同步、存档系统中的性能瓶颈,特别是针对iOS等AOT平台的兼容问题。通过预编译模式,将运行时反射转为静态代码生成,显著提升移动端性能表现,支持协议平滑升级,已成为大厂项目的标配方案。文章从原理、实践到多平台适配,全面展示了这一"序列化发动机"如何支撑现代Unity项目的数据传输需求。

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 495

电磁场仿真软件:Sonnet_(1).Sonnet软件概述

根据特定需求自定义仿真流程,如多频率点仿真、多边界条件仿真等。

kkchenjj的博客 1450

wait和notify原理

文章目录1.wait和notify1.1 小故事1.2 原理1.3 API介绍obj.wait() 和 obj.notify()sleep(long n)和 wait(long n) 的区别2.wait/notify的正确使用3.关于wait与notify和notifyAll方法的总结 1.wait和notify 1.1 小故事 1.2 原理 1.当前线程必须拥有此对象的monitor监视器(锁)。 2.当前线程调用wait()方法,线程就会释放此锁的所有权,并等待 3.直到另一个线程通过调用noti

张大安的博客 1993

FPGA/IC 秋招笔试/面试题总结(目录)

FPGA/IC 秋招笔试/面试题总结-目录介绍 文章目录FPGA/IC 秋招笔试/面试题总结-目录介绍一、FPGA内部资源1. 什么是FPGA2.FPGA内部资源二、同步时钟、同步/异步电路1.同步时钟2.同步/异步电路三、同步复位/异步复位1.同步复位2. 异步复位3. 异步复位同步释放四、同步FIFO/异步FIFO1.同步FIFO2.异步FIFO五、FIFO最小深度计算1.FIFO最小深度2.示例分析六、逻辑电平1.TTL电平标准2.LVTTL电平标准3.CMOS电平标准4.LVCOMS电平标准5.RS

Crazzy_M的博客 2万+

死锁与多线程通信问题

死锁 死锁的情况通常发生于两边的线程都需要对面的运行结果才能继续运行. 示例 public static void main(String[] args) { Criminal c = new Criminal(); Police p = new Police(); Mythread thread = new Mythread(c,p); thread.start();// 警察喊话 c.say(p);// 罪犯喊话 }

鄙视土包子的博客 197

Python爬虫零基础入门【第九章:实战项目教学·第17节】内容指纹去重:URL 变体/重复正文的识别!

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 824

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JAVA的多线程、死锁、线程间通信、如何规避死锁、线程安全的单例模式【转载】

本文链接:https://blog.youkuaiyun.com/weixin_42036256/article/details/103429201

Senye_ing的博客 357

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

JAVA的多线程、死锁、线程间通信、如何规避死锁、线程安全的单例模式

主要内容:多线程线程和进程间的关系Java中的线程理论Java中线程类的实现方式Java中线程的常用方法线程安全性问题线程间通信线程的死锁如何规避死锁线程安全的单例模式 多线程 线程和进程间的关系 进程:计算机中每一个活跃的程序(软件),都是一个独立的进程,进程之间可以是并列的关系,也可以是相互通信的关系 线程:在同一个进程中,负责不同功能的子操作,称之为线程 计算机:国家 软件进程:各省市+省...

程序小白的成长 454

深度学习工具包 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")

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【Java】多线程、线程同步、线程通信、线程调度与死锁

目 录(本篇字数:3817) 进程、线程介绍 程序、进程、线程概念 何时应用多线程? 实现方式 一、继承Thread类 二、实现Runnable接口 线程重要内容 一、常用方法 二、线程调度 1、设置线程优先级 2、yieid()、join()、sleep() 三、线程生命周期 四、线程同步(synchronized) 1、同步代...

weixin_34220834的博客 252

java如何制造死锁_Java编程之多线程死锁与线程间通信简单实现代码

死锁定义死锁是指两个或者多个线程被永久阻塞的一种局面,产生的前提是要有两个或两个以上的线程,并且来操作两个或者多个以上的共同资源;我的理解是用两个线程来举例,现有线程A和B同时操作两个共同资源a和b,A操作a的时候上锁LockA,继续执行的时候,A还需要LockB进行下面的操作,这个时候b资源在被B线程操作,刚好被上了锁LockB,假如此时线程B刚好释放了LockB则没有问题,但没有释放LockB...

weixin_39828193的博客 116

java多线程同步与死锁_线程同步、死锁和通信——Java多线程(二)

一、多线程同步上一篇随笔中,我曾遇到对多线程程序的多次运行结果不一致的情况,这主要是因为没有对这些线程在访问临界资源做必要的控制,而接下来就用线程的同步来解决这个问题。1.同步代码块1 class RunnableDemo implementsRunnable2 {3 private int tickets=5;4 public voidrun()5 {6 whil...

weixin_39776787的博客 158

线程与进程编程:C++中的五种通信方式、死锁及Win32多线程详解

线程与进程编程:C++中的五种通信方式及Win32多线程详解

re1ife的博客 2078

多线程基础知识点死锁 通信 线程池 线程组 定时器

java多线程基础知识点 lock 概述 : 可以更加清晰的加锁和释放锁,JDK5之后就提供了新的锁对象LOCK 方法: void lock( ) 获取锁 void unlock ( ) 释放锁 实现类: ReentrantLock 类 死锁问题 概述 : 是指两个或者两个以上的线程在执行过程中,因为争夺资源产生的一种相互等待现象 同步弊端: 效率低、如果出现了同步嵌套,就容易产生死锁问题 ’ 线程之间的通信问题 不同种类之间针对

Lemon_JK的博客 222

(七)、Java 多线程——死锁、线程间通信

1、死锁 当两个线程相互等待对方释放同步代码块中的“锁对象”时就会发生死锁,Java虚拟机没有监测也没有采取措施来处理死锁情况,所以多线程编程中应该采取措施避免死锁出现。一旦出现死锁,整个程序既不会抛错也不会给出任何提示,只是所有线程处于阻塞状态,无法继续。 以打开空调为例:假设打开空调需要遥控器和电池两个资源 public class OpenAirCondition extends ...

xpeng_V 503

多线程中的线程通信以及死锁问题

多线程中的线程通信问题: 先列出线程中释放锁的操作: 1.当前线程的同步方法、同步代码块执行结束 2.当前线程在同步代码块,同步方法中遇到break、return、终止了该大妈快,方法的执行 3.出现了为处理的error或者exception,导致异常结束 4.当前线程在同步代码块,同步方法中执行了线程对象的wait()方法,当前线程暂停,并释放锁。 线程的通信使用的方法:wait()

Crazer_cy的博客 442

java多线程与死锁_java多线程系列5-死锁与线程间通信

这篇文章介绍java死锁机制和线程间通信死锁死锁:两个或两个以上的线程在争夺资源的过程中,发生的一种相互等待的现象。同步代码块的嵌套案例public classMyLock {//创建两把锁对象public static final Object objA = newObject();public static final Object objB = newObject();}public cla...

weixin_34382844的博客 157

day21-多线程下的单例模式;死锁;线程通信;线程池

文章目录单例模式死锁线程通信生产者和消费者线程池 单例模式 单例模式让某个对象只能实例化对象一次,保证只有一个对象,传统的单例模式写法在多线程中是不想的。 if(s==null){ s = new SingLeton(); } 可能会有多个线程进入判断,导致线程创建多个对象。 如果直接在方法加锁可以避免这个效果,可是这样效率实在太低,为了解决这个问题,我们可以利用两次判断来实现只创建一个对象。 if(s==null){ synchronized(SingLeton.class){ if(s==n

UNknowmer的博客 366
上一篇: 多线程之线程的同步
下一篇: 网络编程之基本概念
jothan_lee
博客等级 码龄9年 30粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值