Java_基础—多线程(同步代码块和同步方法)
来源:互联网 发布:国培网络研修总结 编辑:程序博客网 时间:2024/05/18 07:11
一、什么情况下需要同步?
- 当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步.
- 如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码.
二、同步代码块
- 使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块
- 多个同步代码块如果使用相同的锁对象, 那么他们就是同步的
package com.soar.syn;public class Demo1_Synchronized { /* * 同步代码块 */ public static void main(String[] args) { final Printer p = new Printer(); //匿名内部类使用局部变量必须使用final修饰 new Thread(){ public void run(){ while(true){ p.print1(); } } }.start(); new Thread(){ public void run(){ while(true){ p.print2(); } } }.start(); }}class Printer { Demo d = new Demo(); public void print1(){ synchronized(d){ //同步代码块,锁机制,锁对象可以是任意的 System.out.println("S"); System.out.println("o"); System.out.println("a"); System.out.println("r"); System.out.println(); } } public void print2(){ //synchronized(new Demo()){ //锁对象不能用匿名对象,因为匿名对象不是同一个对象 synchronized(d){ System.out.println("S"); System.out.println("i"); System.out.println("r"); System.out.println(); } }}class Demo{}
三、同步方法的使用
使用synchronized关键字修饰一个方法, 该方法中所有的代码都是同步的,锁对象可以是任意对象,但是被锁的代码需要保证是同一把锁,不能用匿名对象
- 非静态的同步方法的锁是this
- 静态的同步方法的琐是字节码对象(类名.class)
package com.soar.syn;public class Demo2_Synchronized { /* * 同步方法中的代码块 */ public static void main(String[] args) { final Printer p = new Printer(); //匿名内部类使用局部变量必须使用final修饰 new Thread(){ public void run(){ while(true){ p.print1(); } } }.start(); new Thread(){ public void run(){ while(true){ p.print2(); } } }.start(); }}/* //非静态的同步方法的锁对象是什么? //非静态的同步方法的锁对象是thisclass Printer { public synchronized void print1(){ //同步方法只需要在方法上加synchronized关键字即可 System.out.println("S"); System.out.println("o"); System.out.println("a"); System.out.println("r"); System.out.println(); } public void print2(){ synchronized(this){ System.out.println("S"); System.out.println("i"); System.out.println("r"); System.out.println(); } }}*///静态的同步方法的锁对象是什么呢?//是该类的字节码对象class Printer { public static synchronized void print1(){ //同步方法只需要在方法上加synchronized关键字即可 System.out.println("S"); System.out.println("o"); System.out.println("a"); System.out.println("r"); System.out.println(); } public static void print2(){ synchronized(Printer.class){ System.out.println("S"); System.out.println("i"); System.out.println("r"); System.out.println(); } }}
阅读全文
0 0
- Java_基础—多线程(同步代码块和同步方法)
- java多线程——同步方法和同步代码块
- 多线程基础2-同步代码块、同步方法
- 多线程---java同步方法和同步代码块的区别
- java同步方法和同步代码块
- Synchronized 同步方法和同步代码块
- 同步方法和同步代码块
- java同步方法和同步代码块
- 同步方法和同步代码块
- java同步方法和同步代码块
- 多线程基础之同步代码块
- 多线程 同步代码块
- 多线程、同步代码块
- 多线程-同步代码块
- 多线程14__Java同步代码块,同步方法
- 多线程下的懒汉模式,同步代码块和同步方法
- JAVA多线程 <二>同步函数和同步代码块
- 【java0009】多线程同步代码块和同步函数
- PHP文件的锁定机制
- 前端渲染和后端渲染的区别
- Outline agreements 框架协议
- 内存管理单元MMU概述
- skynet coroutine 运行笔记
- Java_基础—多线程(同步代码块和同步方法)
- poj 1414 Life Line
- Comparable与Comparator的区别
- MySQL锁机制和PHP锁机制
- Codeforces 845E Fire in the City
- 胡小胖:微商创业必备的硬件工具
- Java 垃圾回收算法
- Python+Requests接口测试教程(1):Fiddler抓包工具
- http详解