一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 禁止进行指令重排序。 1. volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。 2. volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和…

2021年9月27日 0条评论 1088点热度 0人点赞 小小调酒师 阅读全文

在多线程中有多种方法让线程按特定顺序执行,你可以用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行。 为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。 实际上先启动三个线程中哪一个都行, 因为在每个线程的run方法中用join方法限定了三个线程的执行顺序。 示例代码: 支付 ¥1.99 购买本节后解锁剩余1%的内容 微信支付 如已付费购买,请免登录验证。

2021年9月27日 0条评论 1017点热度 1人点赞 小小调酒师 阅读全文

这两种同步方式有很多相似之处,它们都是加锁方式同步,而且都是阻塞式的同步,也就是说当如果一个线程获得了对象锁,进入了同步块,其他访问该同步块的线程都必须阻塞在同步块外面等待,而进行线程阻塞和唤醒的代价是比较高的。 这两种方式最大区别就是对于Synchronized来说,它是java语言的关键字,是原生语法层面的互斥,需要jvm实现。而ReentrantLock它是JDK 1.5之后提供的API层面的互斥锁,需要lock()和unlock()方法配合try/finally语句块来完成。 Synchronized经过编…

2021年9月27日 0条评论 1172点热度 0人点赞 小小调酒师 阅读全文

start()方法被用来启动新创建的线程,而且start()内部调用了run()方法,这和直接调用run()方法的效果不一样。当你调用run()方法的时候,只会是在原来的线程中调用,没有新的线程启动,start()方法才会启动新线程 。 明显的原因是JAVA提供的锁是对象级的而不是线程级的,每个对象都有锁,通过线程获得。如果线程需要等待某些锁那么调用对象中的wait()方法就有意义了。如果wait()方法定义在Thread类中,线程正在等待的是哪个锁就不明显了。简单的说,由于wait,notify和notifyAl…

2021年9月27日 0条评论 919点热度 0人点赞 小小调酒师 阅读全文

notify可能会导致死锁,而notifyAll则不会。 任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized 中的代码。 使用notifyall,可以唤醒所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一个。 wait() 应配合while循环使用,不应使用if,务必在wait()调用前后都检查条件,如果不满足,必须调用notify()唤醒另外的线程来处理,自己继续wait()直至条件满足再往下执行。 notify() 是对notifyAll()的一个…

2021年9月27日 0条评论 995点热度 0人点赞 小小调酒师 阅读全文

1、使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 2、使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期作废的方法。 3、使用interrupt方法中断线程。 示例代码: 支付 ¥1.99 购买本节后解锁剩余1%的内容 微信支付 如已付费购买,请免登录验证。

2021年9月27日 0条评论 988点热度 1人点赞 小小调酒师 阅读全文

创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。 调用 execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。 因此,长时间保持空闲的线程池不会使用任何资源。 支付 ¥1.99 购买本节后解锁剩余40%的内容 微信支付 如已付费购买,请免登录验证。

2021年9月27日 0条评论 1252点热度 0人点赞 小小调酒师 阅读全文

Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。 Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation对象,然后通过该 Annotation 对象来获取注解中的元数据信息。 Java5.0 定义了 4 个标准的 meta-annotation 类型,它们被用来提供对其它 annotation 类型作说明。 @Target说明了Annotation所修饰的对象范围: Annotation可被用于 pac…

2021年9月27日 0条评论 1039点热度 0人点赞 小小调酒师 阅读全文

Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。 Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据, (因为删除数据以后, 需要把后面所有的数据前移) 缺点: 数组初始化必须指定初始化的长度, 否则报错 例如: List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。 List有两个重要的实现类:ArrayList和LinkedList ArrayList: 可以看作是能够…

2021年9月27日 0条评论 1132点热度 0人点赞 小小调酒师 阅读全文

构造器不能被继承,因此不能被重写,但可以被重载。 String 类是 fifinal 类,不可以被继承,继承 String 本身就是一个错误的行为,对 String 类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A)。 支付 ¥1.99 购买本节后解锁剩余87%的内容 微信支付 如已付费购买,请免登录验证。

2021年9月27日 0条评论 991点热度 0人点赞 小小调酒师 阅读全文
156789