java多线程,java线程同步
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线程同步相关推荐
- Java多线程之线程同步机制(锁,线程池等等)
Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...
- java多线程采集+线程同步-【多线程数据采集之四】
前些日子讲解了java数据抓取, 今天就讲解最核心的. java多线程数据抓取. java多线程采集+数据同步+线程同步[多线程数据采集之四] 主要讲解多线程抓取,多线程同步,多线程启动,控制等操作. ...
- java多线程之线程同步问题
1.线程不安全的问题分析 当多线程并发访问同一个资源对象的时候,可能出现线程不安全的问题.但是,我们分析打印的结果,发现没有问题: 为了让问题更明显: Thread.sleep(10);//当 ...
- Java多线程(线程同步)
多线程编程很容易出现"错误情况",这是由系统的线程调度具有一定的随机性造成的,不过即使程序偶然出现问题,那也是由于编程不当引起.使用多个线程访问同一个数据时很容易出现此类状况,因此 ...
- Java多线程编程——线程同步与线程安全问题及synchronized关键字
在多线程环境下,我们常常需要让多个线程同时去操作同一资源.在某些情况下,这种情形会导致程序的运行结果出现差错.专业上的,当多个线程在执行同一段代码的时候,每次的执行结果和单线程执行的结果都是一样的,不 ...
- java多线程:线程同步synchronized(不同步的问题、队列与锁),死锁的产生和解决
0.不同步的问题 并发的线程不安全问题: 多个线程同时操作同一个对象,如果控制不好,就会产生问题,叫做线程不安全. 我们来看三个比较经典的案例来说明线程不安全的问题. 0.1 订票问题 例如前面说过的 ...
- Java 多线程和线程同步总结
转载:JAVA多线程实现和线程同步总结 1.JAVA多线程实现方式 JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable ...
- Java多线程之线程同步
线程同步 线程同步:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多. ...
- java多线程、线程同步与线程池
1. 线程的基本概念 1.1 进程 任何的软件存储在磁盘中,运行软件的时候,OS使用IO技术,将磁盘中的软件的文件加载到内存,程序在能运行. 进程的概念 : 应用程序(typora,word,IDEA ...
- Java多线程:线程同步(3)- synchronized关键字
最新文章
- 平面法向量,点云法向量估计及可视化
- 替换空格---剑指Offer
- Uedit32和Ubuntu 选定跳转
- vuevant移动端h5底部留白问题
- 解决多线程同时读写一个文件的问题
- 正则表达式的非捕获性分组
- java里shake是什么意思_shake是什么意思_shake在线翻译_英语_读音_用法_例句_海词词典...
- 动态规划 —— 背包问题
- 首个谷歌TensorFlow安全风险被腾讯找到:攻击成本低、迷惑性强
- 优秀程序员必学的开发工具教程!
- vue el-input输入框禁止输入空格
- Linux网络协议原理
- 人在年轻的时候,最核心的能力是什么?-复利(转自知乎)
- 解决no-console异常
- 程序员必备CDN加速jsDelivr+Gihub远程仓库
- C++实现进程通信(管道pipe)
- 搬运视频怎么做成原创 | 短视频批量伪原创
- 基于体素化方法的点云降采样
- springboot整合mybatis
- CS5266BN说明书|CS5266BN QFN48封装规格书|CS5266BN设计资料