Java多线程:线程同步与关键字synchronized
2016-04-20 09:59
537 查看
一、同步的特性
1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.
2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blog.csdn.net/huang_xw/article/details/7318561
3. 如果两个线程要执行一个类中的同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 参见实验2:http://blog.csdn.net/huang_xw/article/details/7318571
4. 如果两个线程要执行一个类中的不同同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 因为一个实例对象就一把锁. 参见实验3:http://blog.csdn.net/huang_xw/article/details/7318578
5. 不光是类实例, 每一个类也对应一把锁, 这样我们也可将类的静态成员函数声明为synchronized, 以控制其对类的静态成员变量的访问. 参见实验4: http://blog.csdn.net/huang_xw/article/details/7318588
二、synchronized的意义
synchronized用于多线程设计, 有了synchronized关键字, 多线程程序的运行结果将变得可以控制. synchronized关键字用于保护共享数据.
三、synchronized实现同步的机制
synchronized依靠"锁"机制进行多线程同步, "锁"有2种, 一种是对象锁, 一种是类锁.
四、synchronized关键字可以修饰的对象
1. synchronized{static方法 or 普通方法} 函数的修饰符, 就是同步方法.
2. synchronized{修饰代码块} 可作为函数内语句的修饰符, 就是同步语句块
3. synchronized{对象引用} 注意对象必须是线程安全的.(比如: StringBuffer在JDK1.5中是线程安全的, 而数组, ArrayList是不安全的). 参见实验5:http://blog.csdn.net/huang_xw/article/details/7318593
附: 解决线程不安全的方法:
1. 如果对象是immutable, 则是线程安全的, 例如: String, 可以放心使用.
2. 如果对象是线程安全的, 例如: StringBuffer, 则放心使用.
3. 有条件线程安全, 对于Vector和Hashtable一般情况下是线程安全的, 但是对于某些特殊情况, 需要通过额外的synchronized保证线程安全.
4. 使用synchronized关键字.
1. 不必同步类中所有的方法, 类可以同时拥有同步和非同步方法.
2. 如果线程拥有同步和非同步方法, 则非同步方法可以被多个线程自由访问而不受锁的限制. 参见实验1:http://blog.csdn.net/huang_xw/article/details/7318561
3. 如果两个线程要执行一个类中的同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 参见实验2:http://blog.csdn.net/huang_xw/article/details/7318571
4. 如果两个线程要执行一个类中的不同同步方法, 并且两个线程使用相同的实例来调用方法, 那么一次只能有一个线程能够执行方法, 另一个需要等待, 直到锁被释放. 因为一个实例对象就一把锁. 参见实验3:http://blog.csdn.net/huang_xw/article/details/7318578
5. 不光是类实例, 每一个类也对应一把锁, 这样我们也可将类的静态成员函数声明为synchronized, 以控制其对类的静态成员变量的访问. 参见实验4: http://blog.csdn.net/huang_xw/article/details/7318588
二、synchronized的意义
synchronized用于多线程设计, 有了synchronized关键字, 多线程程序的运行结果将变得可以控制. synchronized关键字用于保护共享数据.
三、synchronized实现同步的机制
synchronized依靠"锁"机制进行多线程同步, "锁"有2种, 一种是对象锁, 一种是类锁.
四、synchronized关键字可以修饰的对象
1. synchronized{static方法 or 普通方法} 函数的修饰符, 就是同步方法.
2. synchronized{修饰代码块} 可作为函数内语句的修饰符, 就是同步语句块
3. synchronized{对象引用} 注意对象必须是线程安全的.(比如: StringBuffer在JDK1.5中是线程安全的, 而数组, ArrayList是不安全的). 参见实验5:http://blog.csdn.net/huang_xw/article/details/7318593
附: 解决线程不安全的方法:
1. 如果对象是immutable, 则是线程安全的, 例如: String, 可以放心使用.
2. 如果对象是线程安全的, 例如: StringBuffer, 则放心使用.
3. 有条件线程安全, 对于Vector和Hashtable一般情况下是线程安全的, 但是对于某些特殊情况, 需要通过额外的synchronized保证线程安全.
4. 使用synchronized关键字.
相关文章推荐
- java设计模式之单例模式的七种写法
- java -jar Test.jar找不到main class问题
- Java 8 新特性:Lambda 表达式之方法引用(Lambda 表达式补充版)
- Spring之初识JavaBean
- java并发-原子性
- 【java】关于interface成员变量的修饰符
- java web统计当前访问用户数量
- 生成MyEclipse6.5&7.5&8.0注册码的java源码 生成MyEclipse6.5&7.5&8.0注册码的java源码 MyEclipseKeyGen MyEclipse6.5&7.5&
- JAVA简单工厂模式
- spring中@ResponseBody和@JsonProperty作用
- SpringMVC 中无缓存的BasicController的设计
- 错误排查总结-eclipse中junit test或者run main方法报错
- Spring Task定时任务
- jdk版本不一致问题
- java学习之contentprovider
- spring4.2.4+hibernate5.1.0+struts2.3.24整合jar包
- 个人对设计模式的理解-->桥接模式
- 使用 Eclipse Memory Analyzer 进行堆转储文件分析
- spring boot官方中文文档
- Java7新特性--try-with-resources,自动关闭资源