无锁
代码
package com.example.testthread;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private int count =0;
//加锁
synchronized public void updateCount() {
count ++;
Log.d("updateCount","updateCount:"+count);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 线程1
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10000;i++){
updateCount();
}
}
}
).start();
// 线程2
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10000;i++){
updateCount();
}
}
}
).start();
}
}
每次无法到达20000,因为存在进程之间未同步,可能线程1正在对count加1,但是突然线程2到来,线程1还未来的及加1。
加上锁synchronized
在方法前加synchronized,就可以实现同步20000。
把次数显示在Android界面
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/count_text"
android:layout_width="103dp"
android:layout_height="70dp"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
package com.example.testthread;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private int count =0;
TextView countText ;
//加锁
synchronized public void updateCount() {
count ++;
// Log.d("updateCount","updateCount:"+count);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 线程1
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10000;i++){
updateCount();
}
countText.setText("线程1:"+count);
}
}
).start();
// 线程2
new Thread(
new Runnable() {
@Override
public void run() {
for (int i=0;i<10000;i++){
updateCount();
}
countText.setText("线程2:"+count);
}
}
).start();
countText = findViewById(R.id.count_text);
}
}