多线程安全问题可以用下面的案例来描述:
package com.yzh.job.test;
public class Thread3 {
public static void main(String[] args) {
Thread t1 = new Thread(){
@Override
public void run(){
String str = "yuanzhihui";
for(int i = 0;i<10;i++){
for(int j = 0;j<str.length();j++){
System.out.print(str.charAt(j));
}
System.out.println();
}
}
};
Thread t2 = new Thread(){
@Override
public void run(){
String str = "liaohongyu";
for(int i = 0;i<10;i++){
for(int j = 0;j<str.length();j++){
System.out.print(str.charAt(j));
}
System.out.println();
}
}
};
t1.start();
t2.start();
}
}
解决多线程安全问题可以使用下面三种方式:
1、使用synchronized同步关键字
package com.yzh.job.test;
public class Thread3 {
public static void main(String[] args) {
final G g = new G();
Thread t1 = new Thread(){
@Override
public void run(){
String str = "yuanzhihui";
for(int i = 0;i<10;i++){
g.show(str);
}
}
};
Thread t2 = new Thread(){
@Override
public void run(){
String str = "liaohongyu";
for(int i = 0;i<10;i++){
g.show(str);
}
}
};
t1.start();
t2.start();
}
}
class G{
public synchronized void show(String str){
for(int j = 0;j<str.length();j++){
System.out.print(str.charAt(j));
}
System.out.println();
}
}
2、使用同步代码块(对象锁):
package com.yzh.job.test;
public class Thread3 {
public static void main(String[] args) {
final G g = new G();
Thread t1 = new Thread(){
@Override
public void run(){
String str = "yuanzhihui";
for(int i = 0;i<10;i++){
g.show(str);
}
}
};
Thread t2 = new Thread(){
@Override
public void run(){
String str = "liaohongyu";
for(int i = 0;i<10;i++){
g.show(str);
}
}
};
t1.start();
t2.start();
}
}
class G{
public void show(String str){
synchronized(this){
for(int j = 0;j<str.length();j++){
System.out.print(str.charAt(j));
}
System.out.println();
}
}
}
3、使用同步锁:
package com.yzh.job.test;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Thread3 {
public static void main(String[] args) {
final G g = new G();
Thread t1 = new Thread(){
@Override
public void run(){
String str = "yuanzhihui";
for(int i = 0;i<10;i++){
g.show(str);
}
}
};
Thread t2 = new Thread(){
@Override
public void run(){
String str = "liaohongyu";
for(int i = 0;i<10;i++){
g.show(str);
}
}
};
t1.start();
t2.start();
}
}
class G{
//注意要写在方法外面
Lock lock = new ReentrantLock();
public void show(String str){
lock.lock();
for(int j = 0;j<str.length();j++){
System.out.print(str.charAt(j));
}
System.out.println();
//代码完成,释放锁
lock.unlock();
}
}