![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
文章平均质量分 55
一个头一个大
这个作者很懒,什么都没留下…
展开
-
Java多线程之间的通信方式
在Java中线程通信主要有以下三种方式:如果线程之间采用synchronized来保证线程安全,则可以利用wait()、notify()、notifyAll()来实现线程通信。这三个方法都不是Thread类中所声明的方法,而是Object类中声明的方法。原因是每个对象都拥有锁,所以让当前线程等待某个对象的锁,当然应该通过这个对象来操作。并且因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了。另外,这三个方法都是本地方法,并且被final修饰,无法被重写。wait()方法可以让当前线程释放对原创 2022-07-06 15:44:55 · 3235 阅读 · 0 评论 -
JAVA如何实现线程同步?
即有synchronized关键字修饰的方法,由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。需要注意, synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。即有synchronized关键字修饰的语句块,被该关键字修饰的语句块会自动被加上内置锁,从而实现同步。需值得注意的是,同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized原创 2022-07-06 15:35:31 · 541 阅读 · 0 评论 -
Thread类的常用方法
Thread()Thread(String name)Thread(Runnable target)Thread(Runnable target, String name)其中,参数 name为线程名,参数 target为包含线程体的目标对象。currentThread():返回当前正在执行的线程;interrupted():返回当前执行的线程是否已经被中断;sleep(long millis):使当前执行的线程睡眠多少毫秒数;yield():使当前执行的线程自愿暂时放弃对处理器的使用权并允许其他线程执行;原创 2022-07-06 15:20:03 · 1049 阅读 · 0 评论 -
JAVA创建线程的几种方式
通过继承Thread类来创建并启动线程的步骤如下:定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行体。创建Thread子类的实例,即创建了线程对象。调用线程对象的start()方法来启动该线程。通过实现Runnable接口来创建并启动线程的步骤如下:定义Runnable接口的实现类,并实现该接口的run()方法,该run()方法将作为线程执行体。创建Runnable实现类的实例,并将其作为Thread的target来创建Thread对象,Thread对象为线程对象。调用线原创 2022-07-06 15:02:51 · 1173 阅读 · 0 评论 -
Java的序列化与反序列化相关问题
序列化机制可以将对象转换成字节序列,这些字节序列可以保存在磁盘上,也可以在网络中传输,并允许程序将这些字节序列再次恢复成原来的对象。其中,对象的序列化(Serialize),是指将一个Java对象写入IO流中,对象的反序列化(Deserialize),则是指从IO流中恢复该Java对象。若对象要支持序列化机制,则它的类需要实现Serializable接口,该接口是一个标记接口,它没有提供任何方法,只是标明该类是可以序列化的,Java的很多类已经实现了Serializable接口,如包装类、String、Da原创 2022-07-06 11:31:05 · 362 阅读 · 0 评论 -
JAVA的集合类
Java中的集合类主要由Collection和Map这两个接口派生而出,其中Collection接口又派生出三个子接口,分别是Set、List、Queue。所有的Java集合类,都是Set、List、Queue、Map这四个接口的实现类,这四个接口将集合分成了四大类,其中Set代表无序的,元素不可重复的集合;List代表有序的,元素可以重复的集合;Queue代表先进先出(FIFO)的队列;Map代表具有映射关系(key-value)的集合。这些接口拥有众多的实现类,其中最常用的实现类有HashSet、Tre原创 2022-07-06 09:33:58 · 409 阅读 · 0 评论 -
jdk7 和jdk8中的hashmap变化:
7中是Entry数组,8中是Node数组7中数组中放的是链表,8中放的是红黑树或链表、7扩容时是正序遍历原来的链表,将节点依次放在链表头,而8是正序遍历原来的链表,将节点放在链表尾;在并发的情况下,7可能出现并发死链的情况。7扩容时在size > threshold的前提下,还要判断null!=table[bucketIndex],即判断要放的那个桶是不是为空,如果都满足,才扩容;而8只要满足size > threshold就扩容。7在插入新节点时,是插在链表头的;8是插在链表尾的,还要判断是不是数量大于8原创 2022-06-24 16:41:10 · 289 阅读 · 0 评论 -
JAVA集合问题(2)
HashMap底层是一个数组,数组中元素是链表或者红黑树。hashMap补充:注意,自己写的hashmap的key会被覆盖(两个key的hashcode相等,且equals),而java里面的不会;value都会被覆盖jdk8实现懒惰初始化,用到的时候才创建,此时threshold会变为其容量大小,数组在用到的时候才会创建hashmap初始化容量都会转为2的次幂; 没定义容量则初始容量为16map允许key和value为nullhashMap里面得node和treenode都直接继承或间接继承了Ent原创 2022-06-24 16:38:35 · 122 阅读 · 0 评论 -
JAVA集合问题(1)
Vector底层也是一个Object数组,初始容量也是10,但它扩容是扩容2倍,他的方法都使用synchronized锁住了。LinkedList底层是一个双向链表,它继承了Deque和List。HashMap底层是一个数组,数组中元素是链表或者红黑树。Hashtable和HashMap一样,底层都是哈希表数据结构。Hashtable的初始化容量是11,默认加载因子是:0.75fHashtable的扩容是:原容量 * 2 + 1目前只需要掌握Properties属性类对象的相关方法即可。Properties原创 2022-06-24 16:32:02 · 129 阅读 · 0 评论