Java_基础—多线程(同步代码块和同步方法)
2017-09-02 18:13
459 查看
一、什么情况下需要同步?
当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中CPU不要切换到其他线程工作. 这时就需要同步.
如果两段代码是同步的, 那么同一时间只能执行一段, 在一段代码没执行结束之前, 不会执行另外一段代码.
二、同步代码块
使用synchronized关键字加上一个锁对象来定义一段代码, 这就叫同步代码块
多个同步代码块如果使用相同的锁对象, 那么他们就是同步的
三、同步方法的使用
使用synchronized关键字修饰一个方法, 该方法中所有的代码都是同步的,锁对象可以是任意对象,但是被锁的代码需要保证是同一把锁,不能用匿名对象
非静态的同步方法的锁是this
静态的同步方法的琐是字节码对象(类名.class)
当多线程并发, 有多段代码同时执行时, 我们希望某一段代码执行的过程中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(); } } /* //非静态的同步方法的锁对象是什么? //非静态的同步方法的锁对象是this class 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(); } } }
相关文章推荐
- java语言基础(91)——多线程(同步方法解决线程安全问题)
- java多线程——同步方法和同步代码块
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
- 多线程基础2-同步代码块、同步方法
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
- 多线程---java同步方法和同步代码块的区别
- [C#基础教程之]C# 实现多线程的同步方法详解
- java基础学习__多线程(停止线程,守护线程,join方法)
- JAVA基础知识之java多线程时数据同步问题
- Java基础之多线程(一)--概述、同步、死锁、单例模式
- java基础问题---java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用
- 黑马程序员:Java基础总结----多线程安全性&同步
- 黑马程序员--JAVA基础复习之多线程(一)概念与创建方法
- 初学Java多线程:使用Synchronized关键字同步类方法
- 黑马程序员--JAVA基础复习之多线程(二)线程安全与解决方法
- 黑马程序员-JAVA基础-多线程的安全、同步与死锁
- 初学Java多线程:使用Synchronized块同步方法
- 【Java基础】多线程中同步的两种解决方案
- Java基础学习4_多线程(同步)
- 九、初学Java多线程:使用Synchronized关键字同步类方法