摘要:关键字synchronized可以使多个线程访问同一个资源具有同步性,而且他还具有将线程工作内存中的私有变量与公共内存中的变量同步的功能。 以-server服务器模式运行得到死循环 得到上面结果的原因是各个线程间的数据值没有可视性造成的。而关键字synchronized具有可视性。 更改Servic
阅读全文
摘要:原子类在具有逻辑的情况下输出结果也具有随机性 结果分析: 打印顺序出错了,应该每次加100在加一次1,出现这样的情况原因是addAndGet()方法是原子的,但方法和方法直接的调用却不是原子的 解决方案同步
阅读全文
摘要:除了在i++操作时使用synchronized关键字实现同步外,还可以使用AtomicInteger原子类进行实现 原子操作时不可分割的整体,没有其他线程能够中断或检查正在原子操作的变量,一个原子类型就是一个原子操作的可用类型,他可以在没有锁的情况下,做到线程安全 程序运行结果累加到了50000
阅读全文
摘要:关键字volatile虽然增加了实例变量在多个线程之间的可见性,但它却不具备同步性,那么也不具备原子性。 测试 结果:线程异步 更改加上关键字synchronized 在本例中,如果在方法private static void addCount()前加入synchronized同步关键字,也就没有必
阅读全文
摘要:测试 程序处于死循环,为何呢?代码线程被停止了从未被执行。 原因: 在启动RunThread.java线程时,变量private boolean isRunning=true;存在于公共堆栈及线程的私有堆栈中,在JVM被设置为-server模式时为了线程 运行的效率,线程一直在私有堆栈中取得isRu
阅读全文
摘要:测试如下 但当上面的例子代码的格式运行在-server服务器的模式中64bit的JVM上时,会出现死循环 解决的方案时使用volatile关键字 关键字volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值
阅读全文
摘要:关键字volatile的主要作用是使变量在多个线程间可见。 测试如下 程序开始运行后 根本没停下来。原因是main线程一直处理while()循环,导致程序不能执行下面的代码。解决办法肯定是用多线程技术
阅读全文
摘要:在将任何数据类型作为同步锁时,需要注意的是,是否有多个线程同时持有锁对象,如果同时持有相同的锁对象,则这些线程之间就是同步的,如果分别获得锁对象,这些线程之间是异步的。 结果分析: 因为50毫秒过后线程B 获得的锁是456 继续测试: 去掉代码Thread.sleep(50) 线程A和B持有的锁都是
阅读全文
摘要:本实验测试同步代码块synchronized(class2)对class2上锁后,其他线程只能以同步的方式调用class2中的静态同步方法 结果分析 InnerClass1中method1和InnerClass2method1的锁对象是同一个,而InnerClass1中的method2的锁对象是In
阅读全文
摘要:本实验测试是在内置类中有两个同步方法,但使用的却是不同的锁,打印结果也是异步的 由于持有不同的对象监视器,所以打印结果就是乱序的。
阅读全文
摘要:关键字synchronized的知识点还涉及内置类的使用。 内置类还有一种叫做静态内置类
阅读全文
摘要:java线程死锁是一个经典的多线程问题,因为不同的线程都在等待根本不可能释放的锁,从而导致所有的任务无法继续完成,在多线程技术中,死锁是必须避免的,因为会造成线程的假死。 程序运行结果如上。 可以用jdk自带的工具来监测是否有死锁现象 监测出现死锁 死锁是程序设计的bug,在程序设计时就要避免双方互
阅读全文
摘要:同步方法容易造成死循环。 结果运行: 线程B永远得不到运行的机会,锁死了。 这时可以使用同步代码块来解决这样的问题 更改Service.java文件代码 运行结果不再出现同步等待的情况。
阅读全文
摘要:在JVM中具有String常量池缓存的功能 将synchronized(string)同步代码块和String联合使用,结果出现意外 测试 结果是无限循环的打印a 出现这种情况的原因是因为String的两个值都是AA,两个线程持有相同的锁。所以造成线程B不能执行,这就是String常量2池带来的问题
阅读全文
摘要:关键字synchronized还可以应用在static静态方法上,这样写那是对当前的*.java文件对应的class类进行持锁, 测试如下 程序运行结果: 同步的效果,和将synchronized关键字加到非static方法上使用的效果一致,但还是存在本质上的区别,synchronized加到sta
阅读全文
摘要:synchronized(非this对象x)格式的写法是将对象本身作为对象监视器,这样就可以得出以下3个结论。 1)当多个对象同时执行synchronized(x){}同步代码块是呈同步效果 2)当其他线程执行x对象中的synchronized同步方法呈现同步效果 3)当其他线程执行x对象方法里面的
阅读全文
摘要:多个线程调用同一个对象中的不同名称的synchronized同步方法或者synchronized(this)同步代码块时,调用的效果就是按照顺序执行,也就是同步,阻塞的。 这说明synchronized同步方法和synchronized(this)同步代码块分别有两种作用。 a. synchroni
阅读全文
摘要:和synchronized方法一样,synchronized(this)代码块也是锁定当前对象的。 上面结果执行是异步执行的,下面更改othermethod
阅读全文
摘要:结果分析:当一个线程访问object的一个同步代码块时,其他线程对同一个object的所有其他的同步代码块将被阻塞,这说明同步代码块使用的是对象监视
阅读全文
摘要:本例说明:不在同步代码块的是异步执行,在同步代码块时同步的 结果可知:同步代码块的代码是排队执行的,而非同步代码块是异步执行的。
阅读全文
摘要:更改2.2.1代码重新测试 结果分析:当一个线程访问object的一个synchronized同步代码块时,另一个线程仍然可以访问该object对象非synchronized的方法。而且同步代码块里的执行是同步的。
阅读全文
摘要:当两个并发线程访问同一个对象object中的synchronized(this)同步代码块时,一段时间内只能有一个线程执行,另一个线程必须等待期执行完才能执行。 结果表明:方法执行是同步的,但是效果没有提高,下面模拟提高效率
阅读全文
摘要:缺陷:用关键字synchronized声明方法是有弊端的,譬如A线程调用同步方法执行一个长时间的任务,那么B线程则必须等待较长的时间, 解决方法:使用synchronized同步语句块 程序运行了大约6秒。 需要使用同步代码块来解决。
阅读全文
摘要:关键字在使用synchronized时,当线程得到一个对象锁时,这时这个线程再次请求此对象锁是可以拿到的,也就说明同步方法之间是可以进行互相调用的, 可重入锁的概念: 自己可以再次获取自己的内部锁,譬如有一条线程获得了某个对象的对象锁,此时这个对象锁还没释放,当其要再次获得这个对象锁的时候还能获取,
阅读全文
摘要:同步不可以继承 从结果可以分析,同步不能继承,所以还得再子类加上synchoized关键字才行。
阅读全文
摘要:当一个线程执行代码的时候出现异常,则其所持有的锁会自动释放。 线程a出现异常后释放锁,这时线程b可进入执行方法
阅读全文
摘要:虽然在赋值的时候进行了同步,但是在取值的时候会出问题,这就叫做脏读。 发生脏读说明在读取实例变量的值的时候,此值已经被其他线程改过了。 测试如下 出现结果分析: 出现脏读是因为getValue方法不是同步的,所以可以在任意时候进行调用。 解决方案:加上synchronized
阅读全文
摘要:为了证明线程锁的是对象 测试 结果如上分析,代码调用是异步随机执行。 然后在方法中加同步关键字 结果分析: 调用关键字synchronized声明的方法一定是排队运行的,只有共享的资源才需要同步,如果不是共享的资源,根本没有必要同步。 那如果其他的方法被调用会有什么效果。 测试 继续更改MyObje
阅读全文
摘要:测试如下 结果分析:本测试实例化了2个对象,分别开启两个线程进行访问,效果却不是同步执行的,而是异步执行,因为本实例创建了2个锁,虽然使用了synchronized关键字,但是打印顺序不是同步的,而是交叉的。 关键字synchronized取得的锁是对象锁,而非一段代码或方法的锁,哪个线程先执行该关
阅读全文
摘要:若多个线程共同访问1个对象中的实例变量,那么有可能出现非线程安全的问题。 测试如下 结果分析:出现了非线程安全的问题,那如何解决呢? 使用synchronized关键字 结果分析:使用synchronized关键字,当a拿到锁之后,只有当前执行完毕释放锁的时候,b才能拿到锁,解决了线程安全。而且代码
阅读全文
摘要:非线程安全的问题存在于实例变量中,如果是方法内部的私有变量,则不存在非线程安全的问题,所以也就是线程安全了。 测试 结果分析: 方法变量中不存在非线程安全的问题,永远都是线程安全的,这是方法内部变量是私有造成的。
阅读全文
摘要:在java 中有2种线程,1种是守护线程,1种是非守护线程 守护线程是一种特殊的线程,当线程中不存在非守护线程时,则守护线程自动销毁,典型的守护线程就是垃圾回收线程。 测试如下
阅读全文
摘要:继续更改上面1.10.2的优先级使他们俩的优先级差不多 结果说明线程的优先级与打印顺序无关,不要将两者的关系关联,他们的关系有不确定性和随机性
阅读全文
摘要:测试 高优先级的线程总是大部分先执行完,但不代表高优先级的线程全部先执行完,而且当线程的优先级等级差距很大时,谁先执行完和代码调用顺序无关,测试如下 C:\itsoft\jdk\bin\java -Didea.launcher.port=7541 "-Didea.launcher.bin.path=
阅读全文
摘要:jdk中有3个常量来定义优先级 public final static int MIN_PRIOPITY = 1; public final static int NORM_PRIOPITY = 5; public final static int MAX_PRIOPITY = 10; 在java中
阅读全文
摘要:yield()方法的作用放弃当前的cpu资源,将他让给其他的任务去占用cpu的执行时间,但放弃的时间不确定,有可能刚放弃,马上又获得cpu时间片 测试 上述两种情况运行结果 有注释:48毫秒 无注释:11100毫秒 结果说明了他放弃当前的cpu资源。
阅读全文
摘要:结果不同步,程序中使用suspend()得注意。
阅读全文
摘要:这两个方法使用不当,容易造成公共的同步对象的独占,使得其他线程无法访问公共的同步对象 测试 下面是另一种独占锁 如果改成如下 控制台将不打印main end, 因为当程序运行到println方法内部时,同步锁没有被释放
阅读全文
摘要:暂停线程意味着线程还能恢复运行 suspend()方法暂停线程。resume()恢复线程 测试如下 结果分析 线程确实被暂停了,而且还可以恢复成运行的状态。
阅读全文
摘要:用return也能停止线程,不过还是建议抛出异常的方法,因为可以继续往上抛出,让事件传播
阅读全文
摘要:使用stop释放锁将会导致数据出现不一致的结果。 测试如下 综上所述,表明stop方法会导致数据不同步,不建议使用
阅读全文
摘要:调用stop方法时会抛出java.lang.ThreadDeath异常,但一般情况下这个异常不需要显示的捕捉 方法stop已经作废 因为如果强制让线程停止则会使得一些清理性的工作得不到完成,另外一个就是对锁定对象进行解锁,导致数据得不到同步处理,出现数据不一致。
阅读全文
摘要:使用stop方式暴力停止线程 结果分析,当i只执行到8,子线程就被暴力停止了
阅读全文
摘要:在sleep状态下,停止线程。会进入catch语句,并且清除停止状态值,使其变成false 前一个实验是先sleep后,在执行interrupt() 下面实验先停止线程,在进入sleep 结果分析: 这边由于主线程先执行完了代码,给子线程打了停止标记,当子线程执行时线程停止了,再执行sleep方法,
阅读全文
摘要:测试如下 结果分析,这时cpu切换到了主线程执行了interrupt函数,这时,再进入for循环,前面已经执行到了1234,这时打完标记的子线程已经中断了,这时break跳出当前的for循环,但是下面的for循环外的语句还是 会执行的,因为线程已经打了标记,但是线程并没有被立刻中断 那如何使线程被立
阅读全文
摘要:判断线程是否停止的状态 Thread.java类里面提供了两种方法。 1)this.interrupted():测试当前线程是否已经中断 2)this.isInterrupted():测试线程是否已经中断 测试如下 结果分析: 结果表面当前线程并未停止,因为这个当前线程是main线程,所以打印了两个
阅读全文
摘要:调用interrupt()来停止线程,但是interrupt()方法的使用效果并不像是for+break语句那样,马上就停止循环,调用此方法仅仅是在当前线程中打了一个停止的标记,并不是真正的停止线程。 测试如下 结果分析: 主函数开始执行的是主线程,当执行语句sleep时,切换到了子线程,这时执行i
阅读全文
摘要:getId()方法的作用是取得线程的唯一标识。 结果分析当前执行代码的线程名称为main,线程id值为1
阅读全文
摘要:停止线程是在多线程开发时重要的技术。 停止一个线程可以使用Thread.stop()方法,但不建议使用它,这个方法是不安全的,且已经过时。 在java中有以下3种方法可以终止正在运行的线程 1)使用退出标志,使线程正常退出,也就是当run方法完成后,线程终止 2)使用stop方法强行终止线程,但不推
阅读全文
摘要:方法sleep()的作用是指在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)这个正在执行的线程是指this.currentThread()返回的线程。 测试如下 结果分析: 直接调用run方法,说明此时并没有开启子线程,run函数里的方法都是主线程调用的,所以当线程睡眠也是主线程睡眠,代码顺序依
阅读全文
摘要:方法isAlive()的功能是判断当前线程是否处于活动状态 活动状态是线程已经启动且尚未终止,线程处于正在运行或准备开始运行的状态,就认为线程是存活的。 测试如下 结果分析:上面刚开始还没有执行start()方法,所以begin为false,当开启线程之后,先打印end,说明此时cpu切换到了主线程
阅读全文
摘要:该方法可返回代码段正在被哪个线程调用的信息 结果分析:main方法被名为main的线程调用 测试下面 1 package com.cky.thread; 2 3 /** 4 * Created by chenkaiyang on 2017/12/2. 5 */ 6 public class MyFi
阅读全文
摘要:1 package com.cky.test; 2 3 import com.cky.thread.MyThreadThird; 4 5 /** 6 * Created by chenkaiyang on 2017/11/27. 7 */ 8 public class Test3 { 9 publi
阅读全文
摘要:自定义线程类中实例变量针对其他线程可以有共享与不共享的区分,这在多线程中的交互是一个技术点。 (1)不共享数据的情况 多个线程实例 结果分析,这里一共创建了3个线程实例,每个线程都有各自的count变量,各自递减自己的变量,这就说明这个是变量不共享,不存在多个线程共同访问同一个实例的情况。 (2)共
阅读全文
摘要:使用Runnable创建线程 test类 因为java是单根集继承,不支持多继承,为了改变这个限制,使用runnable接口实现多线程 注:Thread类也实现了Runnerable接口,那说明了构造函数不仅仅可以传入runnable接口对象,也可以传递Thread对象,这样做完全可以将一个Thre
阅读全文
摘要:实现多线程的方法有2种:方法一是继承Thread,方法二是实现Runnerable接口 使用继承Thread类的方法创建多线程的时候,最大的局限性就是不支持多继承,因为java语言的特点就是单继承,因此为了支持多继承,完全可以实现Runnerabe接口的方式。 从图中结果可知 再创建测试类 运行结果
阅读全文
摘要:什么是线程? 线程可以理解成是在进程中独立运行的子任务。 使用多线程有什么优点? 使用多任务操作系统Windows后,可以最大限度地利用CPU的空闲时间来处理其他的任务。 使用多线程技术后,可以在同一时间内运行更多不同种类的任务 单任务的特点就是排队执行,也就是同步,就像是cmd输入一条指令后,必须
阅读全文
摘要:参考博客http://blog.csdn.net/xyang81/article/details/52850667 tobato在今年9月份在官方Java客户端的基础上进行了大量重构,且提供了更多丰富的api,主要新增的特性如下: 1 对关键部分代码加入了单元测试,便于理解与服务端的接口交易,提高接
阅读全文
摘要:参考博客:http://blog.csdn.net/xyang81/article/details/52847311 官网Java客户端源代码: https://github.com/happyfish100/fastdfs-client-java 从上面地址下载压缩包,解压 使用idea工具打开执
阅读全文
摘要:开发环境:centos7环境 搭建FastDFS集群搭建非常复杂,对于初期学习FastDFS来说,搭建个单机版的作为入门更为实际一些。 首先感谢“在京奋斗者“”博主的详细搭建过程,附上博客地址http://blog.csdn.net/u012453843/article/details/699519
阅读全文