在线程中我们需要访问的数据没有被保护,这就是多线程最令人头疼的地方,线程安全,多线程之间的数据共享引发的安全问题。解决办法是采用加锁。
何为加锁呢?就是我们将部分数据保护起来,每次只能有一个线程进行访问。
1.Synchronized
1.1同步代码块
有效范围:
同步代码块最小的粒度应该放在共享数据的上下文,或者说共享数据被操作的上下文中。
语法:
Java 中同步代码块的语法如下所示,其中 obj 是任何一个对象;
......
synchronized(obj)
{
......//your business code
}
......
1.2同步方法
方法的同步和代码块的公布大相径庭就是在方法名前面加上 synchronized 关键字,具体的格式如下:
Private|default|protected|public [static] synchronized void|return type
methodName(Parameters)
1.2.1同步重构方法
package com.wenhuisoft.chapter3;
class TicketWindow2 implements Runnable
{
private int max_value = 0;
public void run()
{
while (true)
{
if(ticket())
break;
}
}
/**
*
*/
private synchronized boolean ticket()
{
if (max_value > 500)
{
return true;
}
try
{
Thread.sleep(10);
} catch (InterruptedException e)
{
}
System.out.println(Thread.currentThread().getName() + ":" +
max_value++);
return false;
}
}
1.2.2同步run方法
run 方法加了锁,其他线程只有等待的份,第一个线程执行完毕退出,其他线程获取到了锁,想要执行,一看判断已经不符合则自动退出;因此 run 方法加锁,真实情况是会有多个线程运行,但是只有一个线程执行业务逻辑,其他线程都等于阻塞状态。
1.2.3 同步总结
不管是同步代码块或者同步方法,我们需要事