黑马程序员_同步代码块的作用(synchronized关键字)
2013-03-31 20:12
381 查看
-------
android培训、java培训、期待与您交流!----------
同步代码块(synchronized关键字):
1,书写格式:synchronized(对象) { 需要被同步的代码块 }
2,同步的前提:
①必须要有两个或者两个以上的线程;
②必须是多个线程使用同一个锁(同一共享数据);
注意:要保证同步中只能有一个线程运行。
3,同步的好处:解决了多线程的安全问题;
4,同步的弊端:多个线程需要判断锁,较为消耗资源;
5,如何确定代码块是否需要同步?
①明确 哪些代码是多线程要运行的代码;
②明确共享数据;
③明确多线程运行代码中哪些语句是操作共享数据的。
下面通过代码体现同步代码看的使用方式:
6,synchronized可以用来修饰函数,称为同步函数 ,因为函数需要被对象调用,函数都有一个所属对象调用,就是this,所以同步函
数使用的锁也是this;举例说明:
7,同步函数被静态修饰后使用的锁是什么呢?因为静态进内存时,内存中没有本类对象,但是有该类对应的字节码对象,
类名.class,该对象的类型是Class,所以静态同步函数使用的锁是该方法所在类的字节码对象也就是类名.class。
举例说明:
android培训、java培训、期待与您交流!----------
同步代码块(synchronized关键字):
1,书写格式:synchronized(对象) { 需要被同步的代码块 }
2,同步的前提:
①必须要有两个或者两个以上的线程;
②必须是多个线程使用同一个锁(同一共享数据);
注意:要保证同步中只能有一个线程运行。
3,同步的好处:解决了多线程的安全问题;
4,同步的弊端:多个线程需要判断锁,较为消耗资源;
5,如何确定代码块是否需要同步?
①明确 哪些代码是多线程要运行的代码;
②明确共享数据;
③明确多线程运行代码中哪些语句是操作共享数据的。
下面通过代码体现同步代码看的使用方式:
class Tickets implements Runnable{ private static int tick = 100; Object obj = new Object(); public void run(){ while(true){ synchronized(obj){//synchronized(可以是任意对象){}大括号中的就是共享的数据 if(tick>0){ try { Thread.sleep(20); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" sale: "+tick--); } } } } } public class Demo17 { public static void main(String[] args) { // TODO Auto-generated method stub Tickets t = new Tickets(); new Thread(t).start();//多个线程使用同一个锁(或者称为同一共享数据) new Thread(t).start(); new Thread(t).start(); } }
6,synchronized可以用来修饰函数,称为同步函数 ,因为函数需要被对象调用,函数都有一个所属对象调用,就是this,所以同步函
数使用的锁也是this;举例说明:
class Ticket implements Runnable{ private static int tick = 100; public void run(){ while(true){ show(); } } public synchronized void show(){//同步函数使用的锁是this if(tick>0){ try { Thread.sleep(20); } catch (Exception e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" sale: "+tick--); } } } public class Demo16{ public static void main(String[] args) { Ticket t = new Ticket(); new Thread(t).start(); new Thread(t).start(); new Thread(t).start(); } }
7,同步函数被静态修饰后使用的锁是什么呢?因为静态进内存时,内存中没有本类对象,但是有该类对应的字节码对象,
类名.class,该对象的类型是Class,所以静态同步函数使用的锁是该方法所在类的字节码对象也就是类名.class。
举例说明:
class Single{ private Single(){} private static Single s = null; public static Single getInstance(){ if(s==null){ synchronized(Single.class){//Object obj = new Object();如果括号里放obj是错误的。 if(s==null){ s = new Single(); } } } return s ; } }
相关文章推荐
- java中synchronized关键字作用分析
- 搜狗一道java题目 关于对象 synchronized 关键字作用在 int, integer
- synchronized 和 volatile 关键字的作用和不同
- java中关键字volatile的作用; volatile vs synchronized的区别
- java中synchronized关键字作用分析
- 从JAVA看C#中volatile和synchronized关键字的作用
- 黑马程序员-JAVA学习之多线程和synchronized关键字
- 黑马程序员_final关键字的作用
- java中synchronized关键字作用分析
- java.lang.Object 的 wait 和 notify方法,及关键字 synchronized的作用
- 黑马程序员-Java关键字synchronized
- java中synchronized关键字作用分析
- Java 关键字volatile 与 synchronized 作用与区别
- Java 关键字volatile 和synchronized的作用
- java中synchronized关键字作用分析
- java中synchronized关键字作用分析
- 黑马程序员-synchronized关键字的使用总结
- java中synchronized关键字作用分析
- Java 关键字volatile 与 synchronized 作用与区别
- java中synchronized关键字作用分析