摘要:更改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()恢复线程 测试如下 结果分析 线程确实被暂停了,而且还可以恢复成运行的状态。
阅读全文