- 博客(92)
- 收藏
- 关注
原创 禁止代码重排序——T2330
package 对象及变量的并发访问2;/** * 禁止代码重排序 * 在java程序运行时,JIT(即时编译器)可以动态地改变程序代码运行的顺序,如: * A _耗时严重 * B_耗时少 * C_耗时严重 * D_耗时少 * 在多线程的环境中,JIT有可能进行代码重排序,重排序后代码顺序可能是: * B_耗时少 * D_耗时少 * A_耗时严重 * C_耗时严重 * 这样做的主要原因是CPU流水线是同时
2021-03-28 00:58:45
209
原创 原子性的测试——T2320
package 对象及变量的并发访问2;import 多线程技能1.Test;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicLong;/** * 原子性的测试 * 在32位系统中,针对未使用volatile声明的long或double数据类型没有实现写原子性。 *如果要实现,则声明变量时添加volatile。在64位操作系统中,原子性取决于具体的实现,
2021-03-28 00:56:21
307
原创 可见性的测试——T2310
package 对象及变量的并发访问2;import org.omg.PortableInterceptor.SUCCESSFUL;import 多线程技能1.Run2;import java.nio.channels.FileChannel;import java.util.WeakHashMap;/** * 可见性的测试 * 关键字volatile具有可见性,可见性是指A线程更改变量后,B线程马上能够看到更改后的 *数据,提高程序灵敏度。 * * 线程停止不了的主要
2021-03-28 00:53:55
193
原创 同步写法案例比较——T2225
package 对象及变量的并发访问2;/** * 同步写法案例比较 * 使用synchronized的写法 * * A)testMethod1()和testMethod2()持有的锁是同一个,即MyService.java对应的Class类对象 * B)testMthod3()和testMethod4()持有的锁是同一个,即MyService.java类对象。 * C)testMethod5()持有的锁是字符串abc * * 1和2是同步关系,3和4是同步
2021-03-28 00:49:24
158
原创 JAVA 技术体系——JVM12
package 走进java1;/** * JAVA 技术体系 * 从广义上讲,Kotlin、Clojure、JRuby、Groovy等运行于java虚拟机上的编程语言及其相关的程序 * 都属于java技术体系中的一员。JCP官方定义java技术体系包括5部分: * 1)java程序设计语言 * 2)各种硬件平台上的java虚拟机实现 * 3)Class文件格式 * 4)java类库API * 5)来自商业机构和开源社区的第三方java类库 * 我们可以吧java程序设计语言、
2021-01-19 06:24:50
145
原创 走进java_概述——JVM11
package 走进java1;/** * 概述 * java不仅仅是一门编程语言,它是由一系列计算机软件和规范组成的技术体系,这个技术体系提供了完整的 * 用于软件开发和跨平台的部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务、大型机等多种场合。 * 时至今日,java的设备已经超过45亿,其中包括8亿多台计算机,21亿部移动电话及其手持设备,35亿和智能卡。 * java能得到如此广泛的认可,除了它拥有一门结构严瑾,面向对象的编程语言之外,还有许多不可忽视的优点。 *
2021-01-19 06:23:15
188
原创 锁对象改变导致异步执行——T2223
package 对象及变量的并发访问2;/** * 锁对象改变导致异步执行 * 在将任何数据类型作为同步锁时,需要注意是否有多个线程同时争抢锁对象。如果多个线程同时争抢相同的锁对象, *则这些线程之间就是同步的;如果多个线程分别获得自己的锁,则这些线程之间就是异步的了 * 通常情况下,一旦持有锁后就不再对锁对象进行更改,因为一旦更改就有可能出现一些错误 * * 需要注意的是,字符串String类型是不可变的,用于创建新的内存空间类存储新的字符 * 控制台输出的信息说明A
2021-01-19 06:14:05
258
原创 内部类与同步
package 对象及变量的并发访问2;/** * 内部类与同步-1 */class OutClassT2221{ static class Inner{ public void method1(){ synchronized ("其他的锁"){ for (int i=1;i<=10;++i){ System.out.println(Thread.currentThrea
2021-01-19 06:11:38
153
原创 内置类与静态内置类——T2220
package 对象及变量的并发访问2;/** * 内置类与静态内置类。 */class PublicClassT2220{ private String username; private String password; class PrivateClass{ private String age; private String address; public String getAge() {
2021-01-19 06:08:55
151
原创 多线程的死锁——T2219
package 对象及变量的并发访问2;/** * 多线程的死锁 * java多线程死锁是一个经典的多线程问题,因为不同线程都在等待根本不可能被释放的锁, * 从而导致所有任务都无法继续完成。在多线程技术中,“死锁”是必须避免的,因为这回造成下线程“假死”。 * */class DealThread implements Runnable{ public String username; public Object object=new Object(); p
2021-01-19 06:07:12
158
原创 同步synchronized方法无限等待问题与解决方案——T2218
package 对象及变量的并发访问2;/** * 同步synchronized方法无限等待问题与解决方案 * 但是还是没有解决A死循环的问题啊? * 只是锁了不同类。。。 */class ServiceT2218{ synchronized public void methodA(){ System.out.println("methodA begin"); boolean isContinueRun =true; //制造资
2021-01-14 06:56:24
391
原创 String常量池特性与同步相关的问题与解决方案——T2217
package 对象及变量的并发访问2;/** * String常量池特性与同步相关的问题与解决方案 * JVM中String常量池 * * class test{ * public print(){ * String a="a"; * String b="a"; * sout(a==b); * } * } * * 结果为true; * * 但将synch
2021-01-14 06:53:48
186
原创 同步synchronized(class)代码块可以对类的所有对象实例起作用——T2216
package 对象及变量的并发访问2;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;/** * 同步synchronized(class)代码块可以对类的所有对象实例起作用 * 同步synchronized(class)代码块的作用其实和synchronized static方法的作用一样。 */class ServiceT2216{ public void printA(){
2021-01-14 06:51:03
384
1
原创 同步synchronized static方法可以对类的所有对象实例起作用——T2215
package 对象及变量的并发访问2;/** * 同步synchronized static方法可以对类的所有对象实例起作用 * 虽然不是同一个对象,但静态的同步方法还是同步执行的。 */class ServiceT2215{ synchronized public static void printA(){ try { System.out.println("线程名为:"+Thread.currentThread().getName()+
2021-01-14 06:49:53
153
原创 静态同步synchronized方法与synchronized(class)代码块。——T2214
package 对象及变量的并发访问2;import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;import javax.rmi.ssl.SslRMIClientSocketFactory;/** * 静态同步synchronized方法与synchronized(class)代码块。 * * 关键字synchronize对还可以应用在static静态方法上,是对当前的*java文件所对应的 *Class类对象进行持锁,Clas
2021-01-14 06:47:11
288
原创 类Class的单例性——T2213
package 对象及变量的并发访问2;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import java.text.SimpleDateFormat;/** * 类Class的单例性 * Class类用于描述类的基本信息,包括有多少个字段,有多少个构造方法,有对少个普通方法,为了 * 减少对内存的高占用率,在内存中只需要存在一份Class类对象就可以了,所以是单例设计。 */class MyTe
2021-01-14 06:44:52
263
原创 synchronized(非this对象x)格式的写法是将x对象本身作为“对象监视器”,这样可以有三个结论——T2212
package 对象及变量的并发访问2;/** * 细化验证3个结论 * * synchronized(非this对象x)格式的写法是将x对象本身作为“对象监视器”,这样可以有三个结论 * 1):当多个线程同时执行synchronized(x){}tongue代码块时呈同步效果 * 2):当其他线程执行x对象的synchronized同步方法时呈同步效果 * 3):当其他线程执行x对象方法里面的synchronized(this)代码块时呈现同步效果 */class MyObjec
2021-01-11 06:25:43
207
原创 不同步导致的逻辑错误及其解决方法。——T2211
package 对象及变量的并发访问2;import java.util.ArrayList;import java.util.List;/** * 不同步导致的逻辑错误及其解决方法。 *2——因为两个线程以异步的方式返回list参数的size大小 * 1——将MyService中的操作改为同步 * * 由于list参数对象在项目中是一份实例,是单例,而且也正需要对list参数的getsize方法做同步的调用, * 所以就对list参数进行同步处理。 * */class M
2021-01-11 06:21:21
184
原创 验证方法调用是随机的——T2210
package 对象及变量的并发访问2;import java.util.ArrayList;import java.util.List;/** * 验证方法调用是随机的 * 同步代码块放在非同步synchronized方法进行生命,并不能保证调用方法的线程的执行同步(顺序性) * 也就是线程调用方法的顺序是无序的,虽然在同步块中执行的顺序是同步的。 * * 从结果看 同步带啊方法中的代码是同步输出的,所以线程的进入与退出是成对的,但方法的调用是随机的, * 即线程A和B的执行
2021-01-11 06:20:12
135
原创 多个锁就是异步执行——T2209
package 对象及变量的并发访问2;import lombok.SneakyThrows;/** * 多个锁就是异步执行 * * 第一次结果看:“synchronized(非this对象x)同步代码块"格式进行同步操作,锁必须是同一个,如果不是 * 同一个锁则运行结果就是异步调用,交叉运行。 */class ServiceT2290{ private String usernameParam; private String passwordParam;
2021-01-11 06:18:07
198
原创 将任意对象作为锁——T2208
package 对象及变量的并发访问2;/** * 将任意对象作为锁 * 多个线程调用同一个对象中的不同名称的synchronized同步方法或synchronized(this)同步代码块时,调用的效果是顺序执行的,即同步。 * synchronized同步方法或synchronized(this)同步代码块分别有两种作业 * synchronized同步作用: * 1)对其他synchronized同步方法或synchronized(this)同步代码块调用呈同步效果
2021-01-11 06:16:49
306
原创 验证同步synchronized(this)代码块是锁定当前对象的——T2207
package 对象及变量的并发访问2;import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;/** * 验证同步synchronized(this)代码块是锁定当前对象的。 * 和synchronized一样,synchronized(this)代码块也是锁定当前对象的。 * * 同步输出的原因是使用synchronized(this)同步代码块将当前类的对象作为锁,使用synchro
2021-01-11 06:15:41
453
原创 println()方法也是同步的——T2206
package 对象及变量的并发访问2;/** * println()方法也是同步的 * * JDK的源代码中也有synchronized(this)使用,PrintStream.java类中的println() * * public void println(boolean x) { * synchronized (this) { * print(x); * newLine(); * } *
2021-01-11 06:14:33
185
原创 synchronized代码块之间的同步性——T2205
package 对象及变量的并发访问2;/** * synchronized代码块之间的同步性 * * 在使用同步synchronized(this)代码块时,需要注意,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程 * 对同一个object中所有其他synchronized(this)同步代码块的访问将被阻塞,这说明synchronized使用的对象监视器是同一个,即使用 * 的锁是同一个。 */class ObjectServiceT22
2021-01-11 06:13:35
164
原创 在synchronized中就同步,不在就异步——T2204
package 对象及变量的并发访问2;/** * 一半异步 一半同步 * 在synchronized中就同步,不在就异步。 */class TaskT2240{ public void doLongTimeTask(){ for (int i=0;i<100;++i){ System.out.println("nosynchronized threadName="+Thread.currentThread().getName()+
2021-01-10 06:24:26
126
1
原创 用同步代码块解决同步方法的弊端——T2203
package 对象及变量的并发访问2;/** * 用同步代码块解决同步方法的弊端 * * 从结果看: 当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象中的非synchronized(this)同步代码块 * */class TaskT2230{ private String getDate1; private String getDate2; public void doLongTimeTas
2021-01-10 06:23:06
156
原创 synchronzied同步代码块的使用——T2202
package 对象及变量的并发访问2;/** * synchronzied同步代码块的使用 * * 当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一段时间内只能有一个线程得到执行, *另一个线程必须等待当前线程执行完这个代码块以后才能执行这个代码块。 * * 结果:虽然使用了synchronized同步代码块,但执行的效率还是没有提高,仍然是同步执行的。 * */class ObjectServiceT2220{ pu
2021-01-10 06:21:48
134
原创 synchronized方法的弊端——T2201
package 对象及变量的并发访问2;import sun.security.util.AuthResources_it;/** * synchronized方法的弊端 */class Taskt2210{ private String getDate1; private String getDate2; public synchronized void doLongTimeTask(){ try { System.out.
2021-01-10 06:19:07
113
1
原创 holdsLock(Object obj)方法的使用——T2111
package 对象及变量的并发访问2;/** * public static boolean holdsLock(Object obj)方法的使用 * public static boolean holdsLock(Object obj)方法的作用是当currentThread在指定的对象上保持锁定时,才会返回true */public class T2111 { public static void main(String[] args) { System.ou
2021-01-10 06:17:51
156
原创 重写方法不使用synchronized——T2110
package 对象及变量的并发访问2;import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import 多线程技能1.Test;/** * 重写方法不使用synchronized * 重写方法如果不使用synchronized关键字,即非同步方法,使用之后变成同步反方法。 * * 在重写方法前加上synchronized关键字 程序变为同步执行。 */class MainT2110{ sy
2021-01-10 06:16:16
201
原创 出现异常,锁自动释放——T2109
package 对象及变量的并发访问2;import java.net.InterfaceAddress;/** * 出现异常,锁自动释放 * * 线程A出现异常并释放资源,线程B进入方法正常运行。 * java中的suspend()方法和sleep()连用后出现异常 是不会释放锁的。 * */class ServerT219{ synchronized public void testMentod(){ if(Thread.currentThre
2021-01-10 06:14:47
152
原创 锁重入支持继承的环境——T2108
package 对象及变量的并发访问2;/** * 锁重入支持继承的环境 * 锁重入也支持父子类继承的环境 */class Main{ public int i=10; synchronized public void operateIMainMethodT28(){ try { i--; System.out.println("mian print i="+i); Thread.s
2021-01-10 06:12:52
109
原创 synchronized锁重入——T2107
package 对象及变量的并发访问2;/** * synchronized锁重入 * 关键字synchronized拥有重入锁的功能,即在使用synchronized时,当一个线程得到一个对象锁后,再次请求此对象锁时 * 是可以得到该对象的锁的,这就证明了synchronized方法/快内部调用本类凡人其他synchronized方法/快时,是永远可以得到锁的。 * * “可重入锁”是指自己可以再次获得自己的内部锁,如:一个线程获得了某个对象锁,此时这个对象锁还没有释放,当其再次想要
2021-01-10 06:10:48
85
原创 脏读——T2106
package 对象及变量的并发访问2;/** * 脏读 * * 在多个线程调用同一个方法时为了避免数据出现交叉的情况,使用synchronized关键字来进行同步 * 虽然在赋值时进行了同步,但在取值时有可能出现一些意想不到的情况,这种情况就是脏读(dirty read) * 发生脏读的原因是在读取实例变量的时候,此值已经被其他线程改变。 * * 出现脏读是因为public void getValue()方法并不是同步的,所以可以在任意时刻调用,解决办法就是加上synchro
2021-01-09 06:32:01
201
原创 将synchronized方法与对象作为锁——T2105
package 对象及变量的并发访问2;/** * 将synchronized方法与对象作为锁 * * 在methodA()方法前加入关键字synchronized进行同步处理,程序排队执行,“共享”——只有共享资源的读写访问才需要同步 * 化,如果不是共享资源,那么就没有同步的必要了。 * * 结论: * 1)A线程现持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型方法。 * 2)A线程先持有object对象
2021-01-09 06:30:43
182
原创 多个对象多个锁——T2104
package 对象及变量的并发访问2;/** * 多个对象多个锁 * * 如果先输出 a set over! a=100 然后输出 b set over b=1200 就是同步,而如果输出 a set over 后 输出 b set over 就是异步 * * 本示例中,创建了两个业务(A+B),在系统中产生两个锁,线程和业务对象属于一对一的关系,每个线程执行自己所属的业务对象中的同步方法, *不存在争抢关系,所以运行结果是异步的,另外,在这种情况下,synchronized可以
2021-01-09 06:29:07
273
原创 同步synchronized在字节码指令中的原理——T2103
package 对象及变量的并发访问2;/** * 同步synchronized在字节码指令中的原理 * * 在方法中使用synchronized关键字实现同步的原因是使用了flag标记ACC_SYNCHRONIZED. * 当调用方法时,调用指令会检查方法的ACC_SYNCHRONIZED访问标志是否设置,如果设置了, * 执行线程先持有同步锁,然后执行方法,最后在方法完成时释放锁。 * * public static synchronized void testMethod();
2021-01-09 06:27:45
144
原创 实例变量非线程安全问题与解决方案——T2102
package 对象及变量的并发访问2;/** * 实例变量非线程安全问题与解决方案 * * 如果多个线程共同访问一个对象中的实例变量,则可能出现非线程安全问题 * 用线程访问的对象中如果有多个实例变量,则运行的结果可能出现交叉的情况。 * * 代码没有同步方法,变量出现非线程安全问题 解决——》对addI()方法添加synchronized关键字 * * 两个线程同时访问同一个对象中的同步方法时,一定是线程安全的。 * 此代码中,由于线程是同步访问的,并且a线程先
2021-01-09 06:26:36
109
原创 方法内的变量为线程安全——T2101
package 对象及变量的并发访问2;/** * 方法内的变量为线程安全 * * 非线程安全问题存在于实例变量中,对于方法内部的私有变量,则不会存在非线程 * 安全问题,结果是“线程安全”的。 * * 结果分析 : 方法中的变量不存在非线程安全问题,永远都是线程安全的,这是因为方法内部的变量具有私有特性。 *//** * 测试 */class HasSelfPrivateNumT211 { public void addI(String userName){
2021-01-09 06:25:26
243
原创 synchronized同步方法——T21
package 对象及变量的并发访问2;/** * synchronized同步方法。 * 关键字synchronized可以用来保障原子性、可见性和有序性。 * 非线程安全问题会存在多线程对同一个对象中实现实例变量进行并发访问时发生, * 产生的后果就是“脏读”,也就是读取到的数据其实是被更改过的。而线程安全是指 * 获得实例变量的值是经过同步处理的,不会出现脏读的现象。 */public class T21 {}...
2021-01-09 06:24:04
112
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人