1.Java线程的实现方式:
Java线程的实现方式详解2.线程进程基础知识参考:
进程线程的面试问题小结3.线程面试常见问题参考:
Java常见多线程基础面试问题
@[toc]
一、序言
多线程访问临界资源时的数据安全问题
产生原因:有多个线程在同时访问一个资源,如果一个线程在取值的过程中,时间片又被其他线程抢走了,临界资源问题就产生了
how to解决临界资源问题
解决方案:一个线程在访问临界资源的时候,如果给这个资源“上一把锁”,这个时候如果其他线程也要访问这个资源, 就得在“锁”外面等待
锁
对象锁:任意的对象都可以被当做锁来使用
类锁:把一个类当做锁,语法为:类名.class
同步代码块
语法:
synchronized(锁) {
//需要访问临界资源的代码段
}
说明:
- a.程序走到代码段中,就用锁来锁住了临界资源,这个时候,其他线程不能执行代码段中的代码,只能在锁外边等待
- b.执行完代码段中的这段代码,会自动解锁。然后剩下的其他线程开始争抢cpu时间片
- c.一定要保证不同的线程看到的是同一把锁,否则同步代码块没有意义.
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:
- 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
- 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
- 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
- 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
二、同步代码块和对象锁的使用
在Java中,synchronized关键字是用来控制线程同步的,就是在多线程的环境下,控制synchronized代码段不被多个线程同时执行。
同步代码块结合对象锁
参考代码如下,大家自行运行实践(ps:可以去除 synchronized关键字)
package demo1;
public class SellTickets {
static int count = 10;
//任何对象都可以充当一个对象锁
static Object obj = new Object();
static Runnable r = new Runnable() {
@Override
public void run() {
while(count > 0) {
System.out.println(Thread.currentThread().getName()+"--");
synchronized(obj){
count--;
if(count <= 0) {
return;
}
System.out.println(Thread.currentThread().getName() + "售出了 一张票,剩余" + count);
}
}
}
};
public static void main(String[] args) {
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
// t1.setPriority(8);
t1.start();
t2.start();
t3.start();
}
}
三、同步代码块和类锁的使用
使用类锁的案例如下,参考格式 即 类.class
四、 同步方法
首先给大家展示没有加锁的方法
然后再给大家展示加锁的方法
参考代码如下,大家自行运行实践(ps:可以去除 synchronized关键字)
package demo1;
public class SellTickets {
static int count = 100;
//任何对象都可以充当一个对象锁
//static Object obj = new Object();
static Runnable r = new Runnable() {
@Override
public void run() {
while(count > 0) {
sellTickets();
}
}
//同步方法,作用和同步代码块一样
public synchronized void sellTickets() {
if (count <= 0) {
return;
}
count--;
System.out.println("售票员" + Thread.currentThread().getName() + "售出一张票,余额 为" + count);
}
};
public static void main(String[] args) {
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
// t1.setPriority(8);
t1.start();
t2.start();
t3.start();
}
}
The best investment is to invest in yourself