2019独角兽企业重金招聘Python工程师标准>>>

一、synchronized

1、静态方法的同步,是以当前类为锁对象

public class Test {public static void main(String[] args) {//线程1new Thread(){@Overridepublic void run() {Test.print("线程1");}}.start();//线程2new Thread(){@Overridepublic void run() {try {//线程2挂起,保证线程1先得到锁Thread.sleep(1000);} catch (Exception e) {}Test.print2("线程2");}}.start();}public static synchronized void print(String str){try {//挂起,不释放锁,线程2无法执行Thread.sleep(5000);} catch (Exception e) {}System.out.println(str);}public static synchronized void print2(String str){System.out.println(str);}}

因为两个方法的锁对象都是当前类,因此结果必然是:

线程1
线程2

2、非静态方法的同步,是以当前调用该方法的实例为锁对象

3、代码块的同步,是以输入的实例为锁对象,可以自定义锁对象,也可以直接使用当前调用方法的对象this

二、java.util.concurrent.locks.Lock

被Lock对象包含的代码片段都会被同步,同一个Lock对象的代码,即使在同一个类里的不同方法,或者不同类的方法里面都会被同步

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class Test {private static Lock lock = new ReentrantLock();public static void main(String[] args) {//线程1new Thread(){@Overridepublic void run() {Test.print("线程1");}}.start();//线程2new Thread(){@Overridepublic void run() {try {//挂起线程2,让线程1先抢到锁Thread.sleep(1000);} catch (Exception e) {}new Test().print2("线程2");}}.start();}public static  void print(String str){lock.lock();try {//挂起,不释放锁,线程2无法执行Thread.sleep(5000);} catch (Exception e) {}System.out.println(str);lock.unlock();}public void print2(String str){lock.lock();System.out.println(str);lock.unlock();}}

执行结果必然是:

线程1
线程2

三、java.util.concurrent.atomic

软件包 java.util.concurrent.atomic 是类的小工具包,支持在单个变量上解除锁定的线程安全编程。

import java.util.concurrent.atomic.AtomicInteger;public class Test {private static AtomicInteger ai = new AtomicInteger(0);private static int i = 0;public static void main(String[] args) {for (int j = 0; j < 10; j++) {for (int i = 0; i < 1000; i++) {new Thread(){@Overridepublic void run() {try {Thread.sleep(1000);} catch (Exception e) {}ai.incrementAndGet();}}.start();}for (int i = 0; i < 1000; i++) {new Thread(){@Overridepublic void run() {try {Thread.sleep(1000);} catch (Exception e) {}Test.i++;}}.start();}try {Thread.sleep(10000);System.out.println("ai = "+Test.ai);System.out.println("i = "+Test.i);} catch (Exception e) {}}}}

结果为:

ai = 1000
i = 992
ai = 2000
i = 1979
ai = 3000
i = 2979
ai = 4000
i = 3978
ai = 5000
i = 4977
ai = 6000
i = 5977
ai = 7000
i = 6977
ai = 8000
i = 7976
ai = 9000
i = 8976
ai = 10000
i = 9976

因为AtomicInteger.incrementAndGet()使用JNI调用了底层接口实现了同步。当然,并不是所有的 AtomicInteger方法都可以实现同步。

转载于:https://my.oschina.net/eatsuger/blog/85262

java多线程,java线程同步相关推荐

  1. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

  2. java多线程采集+线程同步-【多线程数据采集之四】

    前些日子讲解了java数据抓取, 今天就讲解最核心的. java多线程数据抓取. java多线程采集+数据同步+线程同步[多线程数据采集之四] 主要讲解多线程抓取,多线程同步,多线程启动,控制等操作. ...

  3. java多线程之线程同步问题

    1.线程不安全的问题分析 当多线程并发访问同一个资源对象的时候,可能出现线程不安全的问题.但是,我们分析打印的结果,发现没有问题: 为了让问题更明显:     Thread.sleep(10);//当 ...

  4. Java多线程(线程同步)

    多线程编程很容易出现"错误情况",这是由系统的线程调度具有一定的随机性造成的,不过即使程序偶然出现问题,那也是由于编程不当引起.使用多个线程访问同一个数据时很容易出现此类状况,因此 ...

  5. Java多线程编程——线程同步与线程安全问题及synchronized关键字

    在多线程环境下,我们常常需要让多个线程同时去操作同一资源.在某些情况下,这种情形会导致程序的运行结果出现差错.专业上的,当多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不 ...

  6. java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决

    0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...

  7. Java 多线程和线程同步总结

    转载:JAVA多线程实现和线程同步总结 1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable ...

  8. Java多线程之线程同步

    线程同步 线程同步:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多. ...

  9. java多线程、线程同步与线程池

    1. 线程的基本概念 1.1 进程 任何的软件存储在磁盘中,运行软件的时候,OS使用IO技术,将磁盘中的软件的文件加载到内存,程序在能运行. 进程的概念 : 应用程序(typora,word,IDEA ...

  10. Java多线程:线程同步(3)- synchronized关键字

最新文章

  1. 平面法向量,点云法向量估计及可视化
  2. 替换空格---剑指Offer
  3. Uedit32和Ubuntu 选定跳转
  4. vuevant移动端h5底部留白问题
  5. 解决多线程同时读写一个文件的问题
  6. 正则表达式的非捕获性分组
  7. java里shake是什么意思_shake是什么意思_shake在线翻译_英语_读音_用法_例句_海词词典...
  8. 动态规划 —— 背包问题
  9. 首个谷歌TensorFlow安全风险被腾讯找到:攻击成本低、迷惑性强
  10. 优秀程序员必学的开发工具教程!
  11. vue el-input输入框禁止输入空格
  12. Linux网络协议原理
  13. 人在年轻的时候,最核心的能力是什么?-复利(转自知乎)
  14. 解决no-console异常
  15. 程序员必备CDN加速jsDelivr+Gihub远程仓库
  16. C++实现进程通信(管道pipe)
  17. 搬运视频怎么做成原创 | 短视频批量伪原创
  18. 基于体素化方法的点云降采样
  19. springboot整合mybatis
  20. CS5266BN说明书|CS5266BN QFN48封装规格书|CS5266BN设计资料

热门文章

  1. java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~...
  2. 祝刘冬冬十八周岁快乐
  3. angularjs指令参数transclude
  4. 值类型和引用类型的区别?
  5. css3常用伪类选择器
  6. 数据库基础知识——互动百科
  7. Angular之constructor和ngOnInit差异及适用场景
  8. 微信小游戏跳坑之旅(一)——使用白鹭引擎开发之创建项目
  9. linux中批量创文件夹的方法
  10. 20162306 2017-2018-1《程序设计与数据结构》 第11周学习总结