package com.bjsxt.base.sync001; import java.util.concurrent.atomic.AtomicInteger; /** * 线程安全概念:当多个线程访问某一个类(对象或方法)时,这个对象始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。 * synchronized:能够在任意对象及方法上加锁,而加锁的这段代码称为"互斥区"或"临界区" * @author alienware * */ public class MyThread extends Thread{ private int count = 5 ; //synchronized加锁 synchronized public void run(){ count--; System.out.println(this.currentThread().getName() + " count = "+ count); } public static void main(String[] args) { /** * 分析:当多个线程访问myThread的run方法时,以排队的方式进行处理(这里排队是按照CPU分配的前后顺序而定的), * 一个线程想要执行synchronized修饰的方法里的代码: * 1 尝试得到锁 * 2 若是拿到锁,执行synchronized代码体内容;拿不到锁,这个线程就会不断的尝试得到这把锁,直到拿到为止, * 并且是多个线程同时去竞争这把锁。(也就是会有锁竞争的问题) */ MyThread myThread = new MyThread(); Thread t1 = new Thread(myThread,"t1"); Thread t2 = new Thread(myThread,"t2"); Thread t3 = new Thread(myThread,"t3"); Thread t4 = new Thread(myThread,"t4"); Thread t5 = new Thread(myThread,"t5"); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); } }
1.1 并发编程的学习的目的java
+ 咱们为何要去学习并发编程?程序员
+ 第一点,这对面试很是重要,是企业面试程序员的标准,是考察要素:面试
1. 考察我公司技术你是否熟悉50%以上,或咱们公司有特殊的技术需求,正好你熟悉。那么可能会考虑录用你编程
2. 细节、态度、人品。(一、2条件知足基本上就会录用你)安全
3. 知识面、潜力(这是加分项)并发
+ 第二点:对本身的技术提高颇有帮助 分布式
+ 第三点:若是你学好了并发编程,在之后的分布式系统中,你均可以找到相似并发、分布式、并行处理问题的概念学习
+ 咱们该如何学习并发编程?this
synchronized, volatile, ReentrantLock, concurrent等字眼看似高深,其实并发编程没有咱们想象中的那么复杂,咱们只须要atom
掌握最基本的概念就能够很轻松地入门,而后从中剖析这些概念的本质,结合实际业务去应用上去,那么你就会成为并发编程方面的专家。
1.2 线程安全
+ 线程安全的概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出
正确的行为,那么这个类(对象或方法)就是线程安全的。
+ synchronized: 能够在任意对象及方法上加锁,而加锁的这段代码称为 互斥区 或 临界区。
示例:【com.bjsxt.thread01】MyThread
示例总结:
当多个线程访问myThread的run方法时,以排队的方式进行处理(这里排队是按照CPU分配的前后顺序而定的),
一个线程想要执行synchronized修饰的方法,首先是尝试得到锁,若是拿到锁,就执行synchronized代码体的内容;拿不到锁,这个线程就会不断地尝试得到这把锁,直到难道为止,并且是多个线程同时去竞争这把锁。也就是会有锁竞争的问题。
+ 多个小朋友上一间厕所的比喻