js 基础篇归纳(有点多不全的地方请见谅)

目录

1.js基础语法

1.1js的认识

1.2js的四种使用方法

1.3认识三种输出方式

1.4es5语法和es6语法区别

1.5数据的类型

1.6经常用到的运算符 

2.循环语法

2.1三种判断语法结构

2.2常用到的逻辑运算符

2.3switch的判断

2.4循环

2.5.认识while 和 do-while的循环原理

3.函数

3.1函数定义的两种方式

3.2认识全局作用域和局部作用域

3.3熟悉形式参数

3.3返回值return

4.数组

4.1什么是数组

4.2数组的增删改查

4.3for循环遍历数组

4.4二维数组认识

5.对象

5.1对象的定义方式

5.2对象的数据添加

5.3对象的遍历循环

5.4string对象

5.5number对象

5.6math 对象

5.6date对象

6.BOM

6.1window对象的直系内置函数方法---3个方法函数

6.2认识window中子级某系对象的方法

7.DOM

7.1DOM获取标签的方法

7.2js对css的细节操作

7.3html和body标签的获取方式

7.4其他获取标签节点的方法

7.5标签的js增删改查

7.6认识事件的四要素

7.7常用的事件


1.js基础语法

1.1js的认识

js---JavaScript(脚本语言)

作用:初期使用它来实现数据结构的梳理,数据的收发(ajax)作业面的交互动画效果

js的三大组成部分

ECMAcript---es语法(js的基础语法规范)

2015年前---es5语法

2015年后---es6语法(简单好写---现在的主流框架)

BOM---浏览对象模型

DOM---文本对象模型

1.2js的四种使用方法

1.内嵌式:<div οnclick="alert()">文本内容</div>

2.内部式:在body结尾的子级位置写一对script标签 ,把js写在标签里面

如下:

<body>
    <div class="box"></div>
    <script>
        for (let a = 0; a < 5; a++) {
                console.log(a);            
        }
    </script>
  
</body>

3.a标签的使用: <a href="javascript:alert()">文本内容</a>

 4.外链式:

            1.创建一个js命名文件夹

            2.创建一个同名文件的js文件

            3.在body结尾的子级位置写一对script标签,

            在开始标签中用src引入文件相对路径

如下:


<body>
    <div class="box"></div>
    <script src="./js/util.js"></script>
</body>

1.3认识三种输出方式

alert("文本内容")---警告弹窗

document.write("带标签结构的文本")---页面显示内容

console.log---后台打印(非常重要)

1.4es5语法和es6语法区别

es5语法:var 变量名

es6语法:let变量名

定义未赋值的变量打印都是undefined

es5允许重复定义 ,es6不行

都可以重新赋值

补充一点:常量定义的时候必须赋值,不能重复定义,不能重新赋值

1.5数据的类型

es5数据类型

 undefined----数据未定义

 number-------数字类型

string-------字符串类型  ""

 boolean------布尔类型  true 真的 false 假的

 null--------空类型

强制转换字符串为数字类型

parselnt---字符串转数字整型

parseFloat---字符串转数字小数的类型

1.6经常用到的运算符 

%---取余运算 10%3=1

++ -- ------自身数据依次+1或-1

+---字符串拼接

+=---累加

es5语法:通过+号拼接

es6语法:`+${变量名}`

示例:

   <div class="box"></div>
    <script>
        let box=document.querySelector(".box")
            let str= `<div>${"好好学习"}`
                str+=`</div>`
            box.innerHTML=str      
    </script>

2.循环语法

2.1三种判断语法结构

单分支语法---满足条件就执行,不满住不管

if(判断条件){

满足条件运行的代码

}

双分支语法---满足条件就执行满足条件的代码,不满足就执行不满足条件的代码

if(判断条件){

满足条件运行的代码

}else{

不满足条件运行的代码

}

多分支语句---有两个判断条件以上,满足条件就执行某个满足条件代码的判断语句

if(判断条件){

满足条件运行的代码

}else if(判断条件){

}else{

上面条件都不满足运行的代码

}

示例:

let a=4
if(a==3){
    a++
}else if(a>6){
    a--
}else{
    a+1
    
}
console.log(a);

2.2常用到的逻辑运算符

!=   !==----不等于

==---只判断相同值,不管数据类型

===----不仅要值相同,数据类型也要相同

&& ---并且--所有条件都要同时满足

||----或者--所有条件只要满足其中一个条件就可以执行代码

!---非判断(判断当前值是不是false或者true)

三目运算: 判断语句? 满足条件运行的代码:不满足条件运行的代码

示例:(后期优化减少代码使用比较多)

    let q=5
    q>7?q++:--q
    console.log(q);

2.3switch的判断

  break: 停止所有循环

 continue: 跳过这次执行下次

   switch (传入判断条件) {

                case 比较精确值1:

                    满足条件的代码

                    break;

                case 比较精确值2:

                    满足条件的代码

                    break;

                case 比较精确值3:

                    满足条件的代码

                    break;

示例:

let a = 4
switch (a) {
    case 1:
        console.log(a);
        break;
    case 3:
        console.log(a);
        break;
    case 4:
        console.log(a);
        break;
    default:
        console.log(a);
        break

}

2.4循环

循环的四要素:

1设置一个循环计数变量

2设置计数变量的变化范围

3设置循环结构体

4循环中要执行的代码

循环结构:

for(let 变量名=1;变量名<=计数最大值;变量名++){

循环中执行的代码

}

示例:

for (let a = 0; a <6; a++) {
console.log(a);    
}

2.5.认识while 和 do-while的循环原理

        while的循环语法结构:

            for (let a=1;a<=10;a++) {

                console.log(a)

            }

            let a=1

            while (a<=10) {

                console.log(a)

                a++

            }

        do---while的循环语法结构:

        let a=1

        do {

            console.log(a)

            a++

        } while (a<=10)

3.函数

函数的作用:把我们写的常用的代码或者一段比较复杂可以实现更细节动画效果的代码用函数封装起来,在需要的地方,调用函数执行操作就可以了,优化代码的结构体

【注意】一次封装,无限调用

3.1函数定义的两种方式

声明式;

function 函数名(){

封装代码

}

调用执行

函数名()

表达式:

let 变量名=function(){

封装代码

}

调用执行

变量名

示例:

let a=6
function fun(){
    if(a>0){
        console.log("a大于零");
    }
}
fun()
// 1.	编写函数实现返回1 - n之间所有整数和

function fun(){
    let a = prompt('输入一个数')
    a = parseInt(a)
    let sum=0
    for(let b=1;b<=a;b++){
        sum+=b
      
    }
    console.log(sum);
}
fun()

3.2认识全局作用域和局部作用域

全局作用域:在全局下定义的变量就是全局变量

全局变量可以在任意作用域使用

局部作用域:在局部作用域下定义的就是局部变量

我们在局部作用域下使用变量的时候优先找局部变量,其次找全局变量

【注意】我们目前把函数之内的区域叫做局部作用域,函数以外的区域叫全局作用域

3.3熟悉形式参数

形式参数:我们要在局部作用域使用的一个数据容器,因为不知道真实数据的内容,所以放个容器,具体的内容由实际参数提供,实际就是拿全局变量换一个身份在局部里面使用,避免全局和局部变量的重名操作。

实际参数:就是在函数调用执行的时候在括号中按照顺序传入全局变量的值

特点:

1形式参数可以有一个以上,不过按照从左往 右的顺序接受实际参数的值

2形式参数可以赋值一个默认值,当有默认值的形式参数,你就算不给他传递实际数据,它也会按照默认数据执行操作

示例:

let a=2;
let q=4
let w=6
let h=9
function fun1(n,t,y){
    a=30
    console.log(a);
    console.log("a----"+n);
    console.log("q---"+t);
    console.log("w___"+y);
    
}
fun1(a,q,w)

3.3返回值return

当我们需要另一个函数中使用当前函数中的局部变量,就必须使用return把值返回到全局操作

特点:

1.return必须写在函数的局部代码最后

2.多个值返回必须打包成数组或对象一次性返回全局

示例:

// 返回值
function funz(){
    let b=20
    return b;
}

let b=funz()
function funn(){
    a=90
    console.log(a+5+b);
}
funn()

4.数组

4.1什么是数组

数组:数据集中打包处理的一种的数据结构

数组的定义:

实例化: let arr=new Array()

字面量:let arr=[]

4.2数组的增删改查

添加数据:

1.直接添加:arr=[添加数据1,添加数据2,添加数据33,...]

2.通过索引添加 :arr[索引值]=添加数据

【注意】索引添加最好按照顺序添加不要出现断层

3.通过内置函数push():arr.push(添加数据)

4.查询数组中的具体数据:let 变量=arr[索引值]

5.数组中数据的修改:arr[要修改的索引值]=修改的数据

6.数组中的数据删除:arr.splice(要删除的数据的索引,从这里删除的数据长度)

以上示例:

let arr=[1,2,3,4]
// 添加数组值
arr[4]=7
console.log(arr);
// 添加数组值
arr.push(9)
console.log(arr);
// 查询数组值
let a=arr[4]
console.log(a);
// 修改数组值
arr[2]=6
console.log(arr);

let arr1=[1,2,3,4,5,6]
console.log(arr1);
// 删除数组值
arr1.splice(1,2)
console.log(arr1);

4.3for循环遍历数组

【注意】设置的计数变量必须从0开始,最大值用arr.length获取并且不能写等于

示例:


let arr1=[1,2,3,4,5,6]
// 循环遍历
for(let a=0;a<arr1.length;a++){
    console.log(arr1[a]);
}

常用的属性:arr.length----数组中数据的长度

常用的方法:arr.push(添加值1,添加值2,...)   arr.splice(要删除的数据的索引,从这里删除的数据长度)

了解:

forEach()-----数组的遍历方法

concat---数组拼接

 pop()---从右往左依次删除一个数据

shift()---从左往右依次删除一个数据

unshift()---从右往左添加数据

slice(开始索引(包含),结束索引(不包含))----截取数组

4.4二维数组认识

arr[数组的索引][数组里面的索引]

let arr = [
    [1, 2, 3, 4, 5],
    ["a", "b", "c", "d", "e"],
    [11, "aa", true, false]
]
//第二个数组里面的第四个值 打印的值为e
console.log(arr[1][4])

5.对象

万物皆对象

5.1对象的定义方式

对象概念:有很多的属性和方法的集合

对象定义方式:

实例化: let obj=new object()

字面量:let obj=[]

键对值----对象中存储数据的结构体

语法结构:let obj={ 键名1:数据1,键名2:数据2}

5.2对象的数据添加

1.在大括号中直接添加键值对

2.通过键名添加对应值

obj.键名=数据

示例:

let arr={a:1,b:2,c:3}
arr.d=4
console.log(arr);

3.对象的查询

let 变量=obj.键名

示例:

let arr={a:1,b:2,c:3}
let a1=arr.a
console.log(a1);

4.对象的修改

obj.键名=数据

示例:

let arr={a:1,b:2,c:3}
arr.a=6
console.log(arr);
console.log(arr.a);

5.对象的删除

delete obj.键名

示例:

let arr={a:1,b:2,c:3}
delete arr.c
console.log(arr);

5.3对象的遍历循环

for..in 遍历循环

示例:

let arr={a:1,b:2,c:3}
for (key in arr) {
            console.log(arr[key])
        }

【注意】

在for..in 遍历中,key代表的是所有的对象中保存数据的键名,但是只限于单独使用,但是要获取所有的值的遍历,在for..in中就必须写成obj[key]的状态,这样key才会变为obj中的各个键名,否者,只会被当作在对象中有一个键名就叫key的值获取

5.4string对象

1.indexof('查询的字符',开始匹配索引)----检查字符串中是否包含这个字符

【注意】

如果找到,会返回这个字符所在的索引值,找不到就返回-1

开=开始匹配值代表的是从哪个位置开始匹配查询,不写就从头开始

示例:

let a='aegergopebjhnoabjknaig'
console.log(a.indexOf('g',0));
//2
console.log(a.indexOf('v',0));
//-1

2.substr和substring-----字符串截取

substr(开始索引,截取长度)

substring(开始索引,结束索引+1)

示例:

//字符串截取
let str="spjgroiuwejhiwesjrobsro"
console.log(str.substr(3,3))
console.log(str.substring(3,6));
// lastIndexOf 找到这个字符所在最后一个的长度
console.log(str.lastIndexOf('r'));//20
//找到这个字符最后所在的长度并打印从它开始到结束的字符串
console.log(str.substring(str.lastIndexOf('b')));

5.5number对象

toFixed(num)------约分小数位数

示例:

let a=23.234235
console.log(a.toFixed(3));

5.6math 对象

ceil()----向上取整

floor()----向下取整 

round()----四舍五入

示例:

let a=3.222
//向上取整
console.log(Math.ceil(a));
//向下取整
console.log(Math.floor(a));
//四舍五入
console.log(Math.round(a));

random()---随机数

  let num =Math.floor(Math.random()*(最大值-最小值 +1)+最小值)

示例:

let nameArr=[1,3,4,5,6]  
// 根据数组长度范围生成随机数
 let i = Math.floor(Math.random() * nameArr.length);

5.6date对象

//获取当前时间
let data = new Date();
let dataString = "现在是北京时间:" + data.toLocaleString();
// 现在是北京时间:2022/5/20 20:03:09

6.BOM

BOM的顶层对象---window

6.1window对象的直系内置函数方法---3个方法函数

1.延时计时器----过来设置时间以后执行的代码

setTimeout(function(){

执行代码

},设置的时间(毫秒为单位))

示例:

setTimeout(function () {
         console.log("好好学习");
//两秒后提示
        },2000)

2.间隙计时函数----每过一段时间就会运行代码一次,如果不关闭就一操作下去

let  time=setInterval(function(){

执行代码

},设置的时间(毫秒为单位))

3.clearInterval (变量) 停止

取消指定的setInterval函数将要执行的代码

示例:


//定义的一个数
let a=5
time=setInterval(function(){
    // 每过一秒减少1
    a--
    // 判断a>0就打印
     if(a>0){
        console.log(a);

     }
    //  否者停止打印
     else{
         //停止
        clearInterval(time)

     }
    
},1000)

6.2认识window中子级某系对象的方法

 history---浏览器的历史记录

 length-----浏览网页的记录

 back()----返回上一个页面---(重点)

 forward()----前进下一个一面

go(1)-------到指定的某个页面(正数前进,负数后退)

<button id="back">返回上一个页面</button>
<button id="forward">前进到下一个页面</button>
<button id="go">到达指定的页面(正数前进,负数后退))</button>
//历史对象的操作
console.log(history,length);
let back=document.getElementById("back")
let forward=document.getElementById("forward")
let go=document.getElementById("go")
back.onclick=function(){
    // history---浏览器的历史记录 一共打开了多少网页
    // 返回上一个页面
    history.back()
}
forward.onclick=function(){
    // 前进到下一个页面
    history.forward()
}
go.onclick=function(){
    // 到达指定的页面(正数前进,负数后退))
    history.go(-3)
}

location---定位对象

href---访问路径地址

location.href=‘路径地址’

示例:

 <button id="ww">网站</button>
//定位对象
let ww=document.getElementById("ww")
ww.onclick=function(){
    // 网页上的地址
    // location.href="http://www.baidu.com"
    // 自己编写的网页
    location.href="index1.html"
}

7.DOM

7.1DOM获取标签的方法

原生四种方法:

 document.getElementById(id值)

 document.getElementsByClassName(类名)

【注意】获取由于是多个标签(一个也一样)会以伪数组的形式

返回标签,我们要用的时候一定要使用索引来获取

document.getElementsByName()-----通过name名字获取input标签

 document.getElementsByTagName()---通过标签名获取标签

h5中的获取方法-----(推荐使用)

document.querySelector(选择器)---获取指定一个标签

document.querySelectorAll(选择器)---获取匹配所有标签(伪数组)

示例:

 <div id="b">12</div>
    <div class="e">23
        <input type="text">
    </div>  <div class="e">23
        <input type="text">
    </div>
    <div class="w">23</div>
    <button id="but">按钮</button>
    <script src="./index.js"></script>

let b=document.querySelector("#b")
console.log(b);
let v=document.querySelectorAll(".e")
console.log(v);

7.2js对css的细节操作

1.文本: innerHTML----给指定标签添加文本内容(可以识别字符串中的标签)

存: 元素 innerHTML=文本 取:let 变量=元素.innerHTML

示例:

<button id="but">按钮</button>
let btn=document.querySelector("#but")
//获取按钮二字
let b= btn.innerHTML 
console.log(b);
//把按钮变成请稍后按我
btn.innerHTML = "请稍后按我"

2.属性:

元素.属性名 = "属性值"

元素.className = "类名1 类名2..."

示例:

<div id="b">12</div>
let btn=document.querySelector("#but")
    // 用js添加id
    div.id = "big"
    div.className = "aaa ddd bbb"
    // 失去点击效果
    btn.disabled = "disabled"

3.改变css:

 元素.style.样式名1(驼峰命名) = "样式值1"

 元素.style.样式名2(驼峰命名) = "样式值2"

let btn=document.querySelector("#but")

//改变样式
btn.style.color = "red"
btn.style.fontSize = "50px"
btn.style.width = "200px"
btn.style.height = "200px" 
btn.style.background = "black"

7.3html和body标签的获取方式

 html: document.documentElement

body: document.body

示例:

 <ul class="list">
        <li>234</li>
        <li class="a">534</li>
        <li>5344</li>
    </ul>
<li class="b">2777</li>
获取html
let html1=document.querySelector("html")
console.log(html1);
重点记
let html=document.documentElement
console.log(html);
获取body
let body1=document.querySelector("body")
console.log(body1);
重点记
let body=document.body
console.log(body);

7.4其他获取标签节点的方法

熟练:---(重点)

parentNode-----获取当前标签父级

previousElementSibling---上一个兄弟及标签      

 nextElementSibling---下一个兄弟及标签

了解:

firstElementChild---获取父级下第一个子级标签

 lastElementChild---获取父级下最后一个子级标签

children------获取所有的父级下的子级标签

firstChild

 lastChild

childNodes

示例:

<ul class="list">
        <li>234</li>
        <li class="a">534</li>
        <li>5344</li>
</ul>
<li class="b">2777</li>
// 获取父级下第一个子级标签
let li=document.querySelector(".list")
console.log(li.firstChild);
// 重点记
console.log(li.firstElementChild);

//获取父级下最后一个子级标签
let li1=document.querySelector(".list")
console.log(li1.lastChild);
// 重点记
console.log(li1.lastElementChild);

//获取当前标签父级
let li3=document.querySelector('.a')
console.log(li3.parentNode);
//获取上一个兄弟级标签
let li2=document.querySelector('.a')
console.log(li2.previousElementSibling);
// 获取下一级兄弟级标签
console.log(li2.nextElementSibling);

7.5标签的js增删改查

createElement()-----创建标签元素对象

 let 变量名 = document.createElement("标签名“)

appendChild()----把一个标签元素作为另一个父级元素的子级添加

父级标签.appendChild(添加的子级标签)

replaceChild()-----修改元素

父级标签.replaceChild(替换,被替换子级)

removeChild()-----删除元素

父级元素.removeChild(删除的子级标签)

示例:

<ul class="list">
<li>234</li>
<li class="a">534</li>
<li>5344</li>
</ul>
<li class="b">2777</li>
// 创建标签createElement
let div=document.createElement("div")
div.style.color="red"
div.style.textAlign="center"
div.style.width="200px"
div.style.height="200px"
div.style.background="yellow" 
div.innerHTML="内容"
div.style.lineHeight="200px"
// appendChild(div)把一个标签元素作为另一个父级元素的子级添加
document.body.appendChild(div)
//修改
let list=document.querySelector(".list")
let li4=document.querySelector(".a")
let li6=document.querySelector(".b")
// 交换
list.replaceChild(li6,li4)
// 删除
list.removeChild(li4)

7.6认识事件的四要素

事件的四要素:

            1.要有事件源

            2.注册对应的事件类型

            3.事件的执行代码和结构体

            4.事件对象

格式:  

  标签元素(事件源).on+事件类型 = function (event) {

                //触发事件执行代码块

                event.方法

            }

委派事件示例:

  <table>
            <tr>
                <td>源码时代小店</td>
                <td>源宝</td>
                <td>026-88888888</td>
                <td>敲代码</td>
                <td><button class="but">删除</button></td>

            </tr>  
</table>  
let table = document.querySelector('table')
//找到大父级做点击事件
    table.onclick = function (e) {
        console.log(e.target.className);
//判断父级下面的子级或者后代级的类名
        if (e.target.className == "but") {
            e.target.parentNode.parentNode.remove()

        }

    }

三种注册方式:

  常用注册方式:----(重点)

                标签元素(事件源).on+事件类型 = function () {

                    //触发事件执行代码块

                }

js的嵌入式注册事件:----不推荐使用

                <标签名 on+事件类型="函数的调用"></标签名>

                对应的函数定义写在外链式的js中

 监听添加事件:-----(重点)

                 标签元素.addEventListener("事件类型",function () {

                    //触发事件执行代码块

                })

【注意】

                如果只做一个事件常用和监听都可以使用,

                如果要做同样的多个事件,必须选择监听实现

示例:

   <div class="di">点我呀!</div>
   <input class="inp" type="text">
   <div class="ts"></div> 
   let di=document.querySelector(".di")
    di.onclick=function(){
        alert(250)
    }
    // 监听事件提示的内容会按照顺序出现
    di.addEventListener("click",function(){
        alert("嗨")
    })
    di.addEventListener("click",function(){
        alert("你是个猪")
    })

7.7常用的事件

onclick-----点击事件

onmouseover--鼠标移入事件

onmouseout--鼠标移出事件

input框:

oninput-----及时输入及时激活

onblur------失焦事件

onchange----输入改变触发事件

示例:

<input class="inp" type="text">
//input框
let inp=document.querySelector(".inp")
let ts=document.querySelector(".ts")

//判断输入的长度
inp.oninput=function(){
    if(inp.value.length<=6){
        ts.style.color="red"
        ts.innerHTML="输入的长度不够"
    
    }else{
        ts.innerHTML=""
    }
}

//鼠标移入事件
inp.onmouseover=function(){
    inp.style.border="2px solid #4e6ef2"
}
inp.onmouseout=function(){
    inp.style.border="2px solid #ccc"
}
}

onload-----窗口加载事件

window.onload = function () {

                    js的全部代码

                }

【原理】

 我们在写外链式的js文件的时候,以后先必须写出窗口加载函数,然后把所有js代码写在这个函数的function中 那么当你把script放入head中,它会预先让标签加载出来以后在执行内部的js代码防止获取标签失败

示例:

// 窗口事件-—-----一定要写
window.onload=function(){

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!下面是一关于Java内存模型基础的博客,包含目录: ## 目录 1. 简介 2. Java内存模型概述 3. 主内存和工作内存 4. 内存间交互操作 * 内存屏障 * volatile关键字 * synchronized关键字 5. 原子性、可见性和有序性 * 原子性 * 可见性 * 有序性 6. happens-before关系 7. synchronized关键字的使用 8. volatile关键字的使用 9. final关键字的使用 10. Java内存模型的实践 ## 1. 简介 Java内存模型是Java虚拟机定义的一种抽象规范,用于描述多线程程序中,线程之间如何通过内存进行通信,并保证线程之间的可见性、有序性和原子性。 ## 2. Java内存模型概述 Java内存模型由主内存和工作内存组成。主内存是所有线程共享的内存区域,而每个线程都有自己的工作内存,用于存储主内存中的变量副本。 ## 3. 主内存和工作内存 主内存是所有线程共享的内存区域,用于存储对象实例、静态变量和类信息等。而每个线程都有自己的工作内存,用于存储主内存中的变量副本。 ## 4. 内存间交互操作 为了保证线程之间的通信和数据一致性,Java提供了多种内存间交互操作,包括内存屏障、volatile关键字和synchronized关键字。 ### 4.1 内存屏障 内存屏障是一种同步机制,用于确保某些操作的执行顺序。它可以防止指令重排序和内存访问重排序,保证线程之间的有序性。 ### 4.2 volatile关键字 volatile关键字用于修饰变量,保证线程之间对该变量的可见性和禁止指令重排序。当一个线程修改了volatile变量的值,其他线程能够立即看到最新的值。 ### 4.3 synchronized关键字 synchronized关键字用于修饰方法或代码块,实现线程之间的互斥访问和对共享数据的同步操作。它可以保证多个线程对同一个对象的同步访问。 ## 5. 原子性、可见性和有序性 Java内存模型中的三个重要概念是原子性、可见性和有序性。 ### 5.1 原子性 原子性是指一个操作是不可中断的,要么全部执行成功,要么全部不执行。Java中的原子操作包括基本数据类型的赋值和读取,以及引用类型的赋值和读取。 ### 5.2 可见性 可见性是指当一个线程修改了共享变量的值时,其他线程能够立即看到最新的值。volatile关键字和synchronized关键字都能保证可见性。 ### 5.3 有序性 有序性是指程序执行的结果按照一定的顺序展现给外部观察者。Java内存模型通过happens-before关系来保证有序性。 ## 6. happens-before关系 happens-before关系是Java内存模型中定义的一种偏序关系,用于判断两个操作是否具有happens-before关系。它可以保证多线程程序的正确性。 ## 7. synchronized关键字的使用 synchronized关键字用于修饰方法或代码块,实现线程之间的互斥访问和对共享数据的同步操作。它可以保证多个线程对同一个对象的同步访问。 ## 8. volatile关键字的使用 volatile关键字用于修饰变量,保证线程之间对该变量的可见性和禁止指令重排序。当一个线程修改了volatile变量的值,其他线程能够立即看到最新的值。 ## 9. final关键字的使用 final关键字用于修饰类、方法和变量,具有不可变性和安全性的特性。它可以保证被final修饰的变量在多线程环境下的安全访问。 ## 10. Java内存模型的实践 在实际开发中,合理地使用Java内存模型的各种特性和机制,可以提高多线程程序的性能和可靠性。本章将介绍一些常见的实践方法和技巧。 以上是关于Java内存模型基础的博客的目录,希望对你有所帮助!如有任何问题,随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值