为什么会有多线程问题?
当多个线程对同一个资源(共享资源)进行更改操作时引起的数据问题
多线程问题解决?
在对共享资源操作的竞态代码块采用单线程模式访问
如何实现单线程模式反问竞态资源?
一般采用锁机制
什么是锁重入?
一个线程获取了该对象的锁以后,则也同时获取了该对象中其他竞态代码块的锁,直到该线程释放该对象,其他线程才可以访问该对象的竞态代码块
以上几个问题是我个人简单理解 这次要说的是关于同步锁synchronized 的我的一些体会
synchroinzed Java关键字 隐式锁 当它修饰一个方法或者代码块时候,能够保证同一时刻最多只有一个线程执行该方法或者代码块
核心特点:锁的是对象
demo1 验证synchroinzed的对竞态区的锁定
public class ThreadDemo {
/**
* 竞态方法 method1
*
* */
public synchronized void method1(){
try{
System.out.println(Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName()+" over");
}catch(Exception e){
e.printStackTrace();
}
}
/**
* 普通方法 method2
*
* */
public void method2(){
System.out.println(Thread.currentThread().getName()+" normal method");
}
/**
* 竞态方法 method3
*
* */
public synchronized void method3(){
try{
System.out.println(Thread.currentThread().getName());
Thread.sleep(5000);
System.out.println(Thread.currentThread().getName()+" over");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] args){
final ThreadDemo threadDemo = new ThreadDemo();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
threadDemo.method1();
}
},"t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
threadDemo.method2();
threadDemo.method3();
}
},"t2");
t1.start();
t2.start();
}
}
执行结果
t1
t2 normal method
t1 over
t2
t2 over
可以看出t1,t2 两个线程对threadDemo对象同时进行了操作,虽然态t1获取了threadDemo的锁,但是不影响其他线程对非竞态方法的访问,却阻塞了其他线程对该对象的所有竞态资源的访问,直到自己执行完毕,释放锁。需要强调的一点是本例中是对threadDemo对象的加锁,作用范围只是该对象。不同对象的验证放在下篇