线程安全问题可以用银行转帐来解释
使用synchronized
一、synchronized作函数修饰符
public synchronized void fun()
{
……..
}
等同于
public void fun()
{
synchronized(this) // this指的是调用这个方法的对象
{
……
}
}
二、synchronized同步程序块
锁住的是obj对象
public void fun_1(someObject obj)
{
synchronized(obj)
{
……
}
}
三、synchronized修饰static方法
public static synchronized void fun_3()
{
……
}
如果方法用static修饰,synchronized的作用范围就是class一级的,它对类的所有对象起作用。
实例代码
package cn.itcast.thread;
public class TraditionalSynchronized {
public static void main(String[] args) {
Outputer outputer=new Outputer();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true)
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.Output("zhangxiaoxiang");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true)
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.Output2("shursulei");
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
while (true)
{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
outputer.Output3("shursulei");
}
}
}).start();
}
}
class Outputer{
//打印字符串
String xxx="";
public void Output(String name)
{
int len=name.length();
synchronized (xxx) //方式一
{
for(int i=0;i<len;i++)
{
System.out.print(name.charAt(i));
}
System.out.println();
}
}
//方式二
public synchronized void Output2(String name)
{
int len=name.length();
{
for(int i=0;i<len;i++)
{
System.out.print(name.charAt(i));
}
System.out.println();
}
}
//
public static synchronized void Output3(String name)
{
int len=name.length();
{
for(int i=0;i<len;i++)
{
System.out.print(name.charAt(i));
}
System.out.println();
}
}
}