初学多线程使用中踩过的坑

在这里插入图片描述

wait使用,外面没有加synchronized ,导致频繁报错。
IllegalMonitorStateException - 如果当前线程不是对象监视器的所有者报异常。
wait使用时会释放锁。并且使当前线程休眠,所以如果没有在synchronized 里面,没有获得锁。就会报错。
synchronized:同步代码块。当多个线程访问共享数据的时候,可以用同步代码块包裹避免多个线程抢占资源出现不完全的情况。
wait() notify() notifyAll() 都必须在synchronized 中使用
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210422082831900.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyNTUzNTA0,size_16,color_FFFFFF,
wait()导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。 被唤醒后按之前的顺序执行。在这里插入图片描述

notifyAll() 唤醒正在等待对象监视器的所有线程

notify() 唤醒正在等待对象监视器的单个线程。
两个方法都不会释放当前的锁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442754.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程线程池的基本创建,使用方法

import java.util.concurrent.*;/*** 多线程线程池的基本创建,使用方法** author silence*/ public class Silence {public static void main(String[] args) {//创建一个线程池 最大线程数量20 核心线程15//如果提交了超过15 不超过20的任务,会创建临时…

使用多线程拷贝文件夹

import java.io.*; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;/*** 使用多线程拷贝文件夹* 不考虑目的地文件的唯一性。 不按源文件格…

javase 的一些基础常用类

/*** author silence* javase 的一些基础常用类*/ public class Silence1 {public static void main(String[] args) { // Obect equals hashcode // Arrays toString sort binarySearch 输出数组 排序 查找 // Objects nonNull isNull 对对象的…

UDP 通讯协议 局域网通信发送消息 简单实现

发送端 import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner;/*** UDP 通讯协议 局域网通信发送消息 简单实现 发送端** author silence*/ public class SendDemo {public static void main(String[] arg…

TCP局域网 通讯 的消息发送

import java.io.*; import java.net.ServerSocket; import java.net.Socket;/*** 初学者TCP局域网 通讯 的消息发送* TCP 服务器* 必须先 打开服务器才能 打开客户端建立连接** author silence*/ public class TcpInput {public static void main(String[] args) throws IOE…

基于多线程的TCP局域网通信,客户端向服务端上传 文件简单实现源码

客户端 import java.io.*; import java.net.Socket;/*** ### 作业3:* 完成文件上传案例学习* - 案例需求* 客户端:数据来自于本地文件,接收服务器反馈* 服务器:接收到的数据写入本地文件,给出反馈* - 案例分析* - 创建…

多线程完成连续打印1-100的数字, 要求一条线程专门打印奇数,另外一条专门用来打印偶数

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit;/*** ### 作业5:* 请利用线程间通信, 完成连续打印1-100的数字, 要求一条线程专…

通过反射获得类的构造引用无视private修饰符

import operate327.Demo; import operate425.demo.demo1.Student;import java.lang.reflect.Constructor;/*** 通过反射获得类的构造引用无视private修饰符** author silence*/ public class ClassConstructor {public static void main(String[] args) throws Exception {//获…

通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值

import operate425.demo.demo1.Student;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException;/*** 通过反射突破private访问修饰符获取私有和公共的属性,设置和获取值** author silence*/ …

通过反射突破访问修饰符,调用private私有的方法

import operate425.demo.demo1.Student;import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method;/*** 通过反射突破访问修饰符,调用private私有的方法** author silence*/ public class Clas…

ArrayList单列集合的简单使用常见方法

import java.util.ArrayList; import java.util.Iterator;/*** ArrayList单列集合的简单使用常见方法** author silence* 单列 :一次只能存储一个数据元素 list.add("张三"); 不像map集合可以存储一个键值对,两个元素 map.put("张三&quo…

使用三种方式创建Class字节码类文件对象

/*** 使用三种方式创建Class字节码类文件对象** author silence*/ public class Demo1 {public static void main(String[] args) throws Exception {Class<?> clazz1 Class.forName("operate425.operate.operate1.Demo1");Class<?> clazz2 Demo1.cl…

通过反射获得私有构造器,创建对象

import java.lang.reflect.Constructor;/*** 通过反射获得私有构造器&#xff0c;创建对象** author silence*/ public class Demo1 {public static void main(String[] args) throws Exception {//获得字节码文件Class<User> userClass User.class;//获得私有化构造方法…

通过反射创建私有化构造的类,并为私有化属性复制。调用私有化方法

import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** 通过反射创建私有化构造的类&#xff0c;并为私有化属性复制。调用私有化方法** author silence*/ public class Demo1 {public static void main(String[] args…

日期时间类解析指定格式字符串日期 转换为自己想要的日期时间格式

import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAccessor;/*** 日期时间类解析指定格式字符串日期 转换为自己想要的日期时间格式** author silence*/ public class Silence {public static void main(String[] args) {//…

较简单的字节输入流输出流拷贝文件

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;/*** 较简单的字节输入流输出流拷贝文件** author silence*/ public class Silence {/*** 需要被拷贝的文件地址 file可以对此文件做获取名字等操作&#xff0c;也可以直接把地址填到流…

普通IO流字符输入输出流文件拷贝

import java.io.*;/*** 普通IO流字符输入输出流文件拷贝** author silence*/ public class Silence {public static void main(String[] args) throws Throwable {//输入流InputStreamReader reader new InputStreamReader(new FileInputStream("D:\\a.txt"));//输出…

使用枚举完成学生类,性别的设置。

/*** 使用枚举完成学生类&#xff0c;性别的设置。** author silence*/ public class Operate1 {public static void main(String[] args) {//之类性别类型为set &#xff0c;限制了性别&#xff0c;增强了安全性Student student new Student(23, Sex.女, "张三");S…

.编写一个注解。并添加元注解,让该注解可以用在方法上,类上,和属性上

/*** author silence* <p>* test标注的会被调用*/ public class DemoA {public void method1() {System.out.println("DemoA method1方法被调用");}Testpublic void method2() {System.out.println("DemoA method2方法被调用");}Testpublic void m…

反射小结

import operate415.demo.demo1.Str; import operate427.demo.demo5.Demo1;import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method;/*** 反射调用的大概了解简单小结调用** author silence*/ public class Silence {public s…