JAVA多线程(3)——如何加锁
1、加锁不正确导致数据不一致:m1执行过程中,m2(未加synchronized)可以执行,因为m2不用获得锁就可以执行
1 public class TT implements Runnable {
2 int b = 100;
3
4 public synchronized void m1() throws Exception {
5 b = 1000;
6 System.out.println("in m1() before sleep,b="+b);
7 Thread.sleep(5000);
8 System.out.println("in m1() after sleep,b="+b);
9 }
10
11 public void m2() {
12 //public synchronized void m2() throws Exception {
13 b = 199;
14 System.out.println("in m2(),b="+b);
15 }
16
17 public void run() {
18 try {
19 m1();
20 } catch (Exception e) {
21 e.printStackTrace();
22 }
23 }
24
25 public static void main(String[] args) throws Exception {
26 TT tt = new TT();
27 System.out.println("in main() just after new TT(),b=" + tt.b);
28 Thread t = new Thread(tt);
29 t.start();
30
31 Thread.sleep(1000); //为了让m1能够执行b=1000的赋值
32 tt.m2(); // 主线程执行m2
33
34 System.out.println("in main() last,b=" + tt.b);
35 }
36 }
结果:
D:\聚划算\技术部\编程练习\TestThread\Sync>java TT
in main() just after new TT(),b=100
in m1() before sleep,b=1000
in m2(),b=199
in main() last,b=199
in m1() after sleep,b=199 //main线程先于t线程结束吗?
说明:锁定当前对象 只是针对synchronized 这段话,另外的线程完全有可能访问没有锁定的方法(即不带synchronized 的方法)
问题:要保证对资源b的正确访问,需要考虑所有访问b的所有方法,是否需要加同步:加了同步效率可能变低、不加同步可能会出现数据不一致
问题:main线程先于t线程结束吗?
解答:会,main方法即使执行完最后的语句,JVM也不会结束该程序,要等到主线程中的所有其它线程都结束之后,才结束该JAVA应用程序
2、解决上述访问资源b,数据不一致的问题:把所有访问b的方法加锁,m1执行过程,m2一定执行不了,执行m2时必须要得到当前对象的锁才能执行
1 public class TT implements Runnable {
2 int b = 100;
3
4 public synchronized void m1() throws Exception {
5 b = 1000;
6 System.out.println("in m1() before sleep,b="+b);
7 Thread.sleep(5000);
8 System.out.println("in m1() after sleep,b="+b);
9 }
10
11 public synchronized void m2() {
12 //public synchronized void m2() throws Exception {
13 b = 199;
14 System.out.println("in m2(),b="+b);
15 }
16
17 public void run() {
18 try {
19 m1();
20 } catch (Exception e) {
21 e.printStackTrace();
22 }
23 }
24
25 public static void main(String[] args) throws Exception {
26 TT tt = new TT();
27 System.out.println("in main() just after new TT(),b=" + tt.b);
28 Thread t = new Thread(tt);
29 t.start();
30
31 Thread.sleep(1000); //为了让m1能够执行b=1000的赋值
32 tt.m2();
33
34 System.out.println("in main() last,b=" + tt.b);
35 }
36 }
结果:
D:\聚划算\技术部\编程练习\TestThread\Sync>java TT
in main() just after new TT(),b=100
in m1() before sleep,b=1000
in m1() after sleep,b=1000 //m1执行完了才会执行m2
in m2(),b=199
in main() last,b=199
举例:
JAVA多线程(3)——如何加锁的更多相关文章
- java多线程(五)-访问共享资源以及加锁机制(synchronized,lock,voliate)
对于单线程的顺序编程而言,每次只做一件事情,其享有的资源不会产生什么冲突,但是对于多线程编程,这就是一个重要问题了,比如打印机的打印工作,如果两个线程都同时进行打印工作,那这就会产生混乱了.再比如说, ...
- Java 多线程加锁的方式总结及对比(转载)
转自https://blog.csdn.net/u010842515/article/details/67634813 参考博文:http://www.cnblogs.com/handsomeye/p ...
- java多线程加锁是对谁加锁?
1.java多线程加锁是对谁加锁? 答:当然是对共享资源加锁啊,对谁进行访问修改,就对象进行加锁.以便使多线程按序访问此共享对象 比如: 在具体的Java代码中需要完成一下两个操作:把竞争访问的资源类 ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程基础知识篇
这篇是Java多线程基本用法的一个总结. 本篇文章会从一下几个方面来说明Java多线程的基本用法: 如何使用多线程 如何得到多线程的一些信息 如何停止线程 如何暂停线程 线程的一些其他用法 所有的代码 ...
- 第一章 Java多线程技能
1.初步了解"进程"."线程"."多线程" 说到多线程,大多都会联系到"进程"和"线程".那么这两者 ...
- java从基础知识(十)java多线程(下)
首先介绍可见性.原子性.有序性.重排序这几个概念 原子性:即一个操作或多个操作要么全部执行并且执行的过程不会被任何因素打断,要么都不执行. 可见性:一个线程对共享变量值的修改,能够及时地被其它线程看到 ...
- Java多线程-并发容器
Java多线程-并发容器 在Java1.5之后,通过几个并发容器类来改进同步容器类,同步容器类是通过将容器的状态串行访问,从而实现它们的线程安全的,这样做会消弱了并发性,当多个线程并发的竞争容器锁的时 ...
- Java多线程编程核心技术---学习分享
继承Thread类实现多线程 public class MyThread extends Thread { @Override public void run() { super.run(); Sys ...
- Java多线程总结之线程安全队列Queue
在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列.Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非 ...
随机推荐
- PowerShell:因为在此系统上禁止运行脚本,解决方法
解决方案 get-executionpolicy set-executionpolicy remotesigned 输入Y 至此问题解决
- vscode+gdb 配置
到这个网址下载 mingw c语言环境 https://sourceforge.net/projects/mingw-w64/files/mingw-w64/ 我是windows64 位,直接下载这个 ...
- [Lua] IT技术熟练度生成器 | 根据IT活动记录生成md表格 | 自创
IT技术熟练度 v1.0 为衡量个人能力水平自创的一套评分机制,根据时间.代码行数.基础理论三个变量生成.最近在学lua,正好练下基本功.效果可见 个人介绍 | 代码统计 - 小能日记 - 博客园 ( ...
- 高性能MySQL实战(一):表结构
最近因需求改动新增了一些数据库表,但是在定义表结构时,具体列属性的选择有些不知其所以然,索引的添加也有遗漏和不规范的地方,所以我打算为创建一个高性能表的过程以实战的形式写一个专题,以此来学习和巩固这些 ...
- SqlServer表添加字段
IF NOT EXISTS (SELECT * FROM syscolumns WHERE id=object_id('表名') AND name='字段名') ALTER TABLE 表名 ADD ...
- CodeForces 1367F2 Flying Sort (Hard Version)
题意 给一个长度为\(n\)的数组,你可以有两种操作 将某一个数放置在数组开头 将某一个数放置在数组结尾 问最小操作多少次可以得到一个非递减数列 (比\(F1\)难在\(n\)变大,且数组中元素可以有 ...
- WPF MVVM之点滴分享
(第五点:绑定源有修改) 我并不打算长篇累牍的介绍什么是MVVM.我尽量简洁的介绍,并把自己的经验分享给大家. 一.关于MVVM M:Model,数据模型(后台存储数据的类) V:View,视图(大部 ...
- jQuery Ajax执行顺序问题
代码如下: $(document).ready(function () { var res; $.ajax({ type: 'post', url: 'GridDemo.aspx/PlaceOrder ...
- html页面底部添加版权信息
话不多说,直接上代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...
- selenium库浅析
selenium库浅析 基于4.3 pip install selenium安装好后,在sitepackages下 2个主要的目录,common和webdriver 1- common 该目录一共就一 ...